locked
UpdateSourceTrigger=Explicit התכונה RRS feed

  • שאלה

  • שלום :

    למדתי BingData    עם תכונה בשם

    UpdateSourceTrigger=Explicit

     כלומר שהנתונים יעודכנו רק במקרה שיש קוד יעודי  בC# .

    במקרה שלי יש TEXTBOX  ו LABEL  וקשרתי את הנתונים כך שמה שיכתבו בTEXTBOX יופיע CLABEL רק כאשר ילחצו על הכפתור שאז יפעיל את הפונקציה של EXPLICT.

    מה שקורה באמת שהוא מתעלם מזה , והוא מעדכן מייד כאשר מכניסים את הנתונים לתוך ה TEXTBOX

    אני מצרף קוד:

    <Window x:Class="wpff.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            
        </Window.Resources>
        <Grid>
            <Label x:Name="Expl_Lable" Content="{Binding Path=Text, ElementName=textBox1, Mode=OneWay, UpdateSourceTrigger=Explicit}" Height="105" HorizontalAlignment="Left" Margin="126,43,0,0"  VerticalAlignment="Top" Width="249" FontSize="{Binding ElementName=slider1, Path=Value, UpdateSourceTrigger=Default}" />
            <Slider Height="135" HorizontalAlignment="Left" Margin="29,33,0,0" Name="slider1" VerticalAlignment="Top" Width="34" Orientation="Vertical" Minimum="10" Maximum="55" Value="25" />
            <Button Content="this.Close()" Height="38" HorizontalAlignment="Left" Margin="51,242,0,0" Name="button1" VerticalAlignment="Top" Width="100" Click="button1_Click" />
            <TextBox Height="33" HorizontalAlignment="Left" Margin="138,135,0,0" Name="textBox1" VerticalAlignment="Top" Width="192" Text="Explict" />
            <Button Content="Explict Now!" Height="32" HorizontalAlignment="Left" Margin="237,243,0,0" Name="button2" VerticalAlignment="Top" Width="103" />
        </Grid>
    </Window>
    
    
    
    namespace wpff
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                this.Close();
            }
    
            private void Exp_click(object sender, RoutedEventArgs e)
            {//
                Expl_Lable.GetBindingExpression(Label.ContentProperty).UpdateSource();
            }
    

    יום שלישי 08 מאי 2012 08:31

תשובות

  • אתה מסתכל על זה קצת הפוך, אני חושב - יש מצב שאני מתבלבל אז מקוה שמישהו יעיר לי אם אני טועה.

    הצד שעליו אתה רושם את הbinding הוא המטרה (target)

    האלמנט שאליו אתה עושה את הbinding הוא המקור.

    כלומר צריך להחליף כמה שורות במשהו בסגנון הבא (אני מאמין שתבין מה הולך איפה):

    <Label x:Name="Expl_Lable" Content="Explicit" Height="105" HorizontalAlignment="Left" Margin="126,43,0,0"  VerticalAlignment="Top" Width="249" FontSize="{Binding ElementName=slider1, Path=Value, UpdateSourceTrigger=Default}" />
    <TextBox Height="33" HorizontalAlignment="Left" Margin="138,135,0,0" Name="textBox1" VerticalAlignment="Top" Width="192" Text="{Binding Path=Content, ElementName=Expl_Lable, Mode=OneWayToSource, UpdateSourceTrigger=Explicit}" />

            private void Exp_click(object sender, RoutedEventArgs e)
            {//
                textBox1.GetBindingExpression(TextBox.TextProperty).UpdateSource();
            }

    מקווה שזה עזר


    sainity is overrated


    • נערך על-ידי slave of the mind יום שלישי 08 מאי 2012 19:30
    • הוצע כתשובה על-ידי Elad R Katz יום שישי 11 מאי 2012 09:39
    • סומן כתשובה על-ידי Elad R Katz יום שלישי 15 מאי 2012 20:48
    יום שלישי 08 מאי 2012 19:28
  • בעת לחיצה על הכפתור אני רוצה שתיבת הטקסט textBox2, תעדכן את המקור שהיא בינדינג אליו - textBox1 

    לכן הקוד הנכון הוא: textBox2.GetBindingExpression(TextBox.TextProperty).UpdateSource();

    (נ.ב. ארוע הלחיצה Exp_Click לא מחובר לכפתור )

    בהצלחה

    • סומן כתשובה על-ידי עמיאל כהן יום שלישי 15 מאי 2012 07:11
    יום שני 14 מאי 2012 13:38

כל התגובות

  • אתה מסתכל על זה קצת הפוך, אני חושב - יש מצב שאני מתבלבל אז מקוה שמישהו יעיר לי אם אני טועה.

    הצד שעליו אתה רושם את הbinding הוא המטרה (target)

    האלמנט שאליו אתה עושה את הbinding הוא המקור.

    כלומר צריך להחליף כמה שורות במשהו בסגנון הבא (אני מאמין שתבין מה הולך איפה):

    <Label x:Name="Expl_Lable" Content="Explicit" Height="105" HorizontalAlignment="Left" Margin="126,43,0,0"  VerticalAlignment="Top" Width="249" FontSize="{Binding ElementName=slider1, Path=Value, UpdateSourceTrigger=Default}" />
    <TextBox Height="33" HorizontalAlignment="Left" Margin="138,135,0,0" Name="textBox1" VerticalAlignment="Top" Width="192" Text="{Binding Path=Content, ElementName=Expl_Lable, Mode=OneWayToSource, UpdateSourceTrigger=Explicit}" />

            private void Exp_click(object sender, RoutedEventArgs e)
            {//
                textBox1.GetBindingExpression(TextBox.TextProperty).UpdateSource();
            }

    מקווה שזה עזר


    sainity is overrated


    • נערך על-ידי slave of the mind יום שלישי 08 מאי 2012 19:30
    • הוצע כתשובה על-ידי Elad R Katz יום שישי 11 מאי 2012 09:39
    • סומן כתשובה על-ידי Elad R Katz יום שלישי 15 מאי 2012 20:48
    יום שלישי 08 מאי 2012 19:28
  • אני חושב שאתה טועה . .

    א. הכנסתי את הקוד כמו שאמרת לי , וזה עדיין לא פותר את בעיה .

    ב. אני לא חושב שטעיתי בהגדרה של אובייקט המקור והיעד .

    אשמח אם אם אקבל פתרון טוב .

    יום חמישי 10 מאי 2012 11:07
  • א. אולי תוסיף לכפתור של Explicit קריאה למתודה כלומר click="Exp_click"//z כי סביר להניח שבלי זה המתודה שלך לא נקראת.

    ב. לפחות לפי העובדה שלbinding יש מאפיין Source שאתה יכול לכוון אז אני דיי בטוח, שוב אם מישהו שאכן כבר מומחה יתקן אותי או תיתן לי לינק למאמר מוסמך בעניין אני אודה בטעותי אבל לבינתיים אני דיי בטוח בעצמי.


    sainity is overrated

    יום חמישי 10 מאי 2012 19:55
  • slave of the mind צודק. אני אסביר:

    השורה הזו היא השורה המבלבלת -

    <Label x:Name="Expl_Lable" Content="{Binding Path=Text, ElementName=textBox1, Mode=OneWay, UpdateSourceTrigger=Explicit}" 

    אתה רשמת כאן שהBinding הוא חד כיווני, דהיינו אך ורק מהמקור (מה TextBox) למטרה (ל Label). במקרה הזה, המטרה אף פעם לא תגרום לעדכון של המקור.
    UpdateSourceTrigger רלוונטי אך ורק במידה וה Binding הוא דו כיווני, ואז המטרה יכולה לעדכן את המקור. updateSourceTrigger שולט מתי במתי המטרה תעדכן את המקור. במקרה שלך זה לא רלוונטי, כי המטרה היא לא קונטרול שאפשר לערוך.


    http://blogs.microsoft.co.il/blogs/eladkatz @ElatKt

    • הוצע כתשובה על-ידי Elad R Katz יום שישי 11 מאי 2012 09:38
    יום שישי 11 מאי 2012 09:38
  • שלום אלעד.

    אם אני הבנתי אותך נכון זה כך : 

    כאשר אני רוצה להשתמש בתכונה Explict , אוכל לעשות זאת רק אם גם אובייקט המקור , וגם אובייקט היעד - לשניהם יש דרך לעדכן אחד את השני. יצאו הLabel וכו' שאין להם אפשרות לעדכן , את המקור TextBox  במקרה שלנו . 

    ע"פ ההבנה הזו, בדוגמא שלי שיניתי את התוכנית כך שאני הורדתי את  Label והוספתח עוד TextBox כך שאם אני אכתוב משהו ב TextBox הוא יעדכן את  הTextBox השני רק כאשר נלחץ על הכפתור, ששם יש קוד יעודי לזה . 

    אך לצערי גם זה לא עובד לי  . 

    אשמח אם תתקן לי , ותסביר למה אני כ"כ מסתבך כאן ? 

    <Window x:Class="wpff.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            
        </Window.Resources>
        <Grid>
            <Label x:Name="Expl_Lable" Content="Explict!!!" Height="105" HorizontalAlignment="Left" Margin="126,43,0,0"  VerticalAlignment="Top" Width="249" FontSize="{Binding ElementName=slider1, Path=Value, UpdateSourceTrigger=Default}" />
            <Slider Height="135" HorizontalAlignment="Left" Margin="29,33,0,0" Name="slider1" VerticalAlignment="Top" Width="34" Orientation="Vertical" Minimum="10" Maximum="55" Value="25" />
            <Button Content="this.Close()" Height="38" HorizontalAlignment="Left" Margin="51,242,0,0" Name="button1" VerticalAlignment="Top" Width="100" Click="button1_Click" />
            <TextBox Height="33" HorizontalAlignment="Left" Margin="138,135,0,0" Name="textBox1" VerticalAlignment="Top" Width="192" Text="{Binding ElementName=Expl_Lable, Path=Content, Mode=TwoWay, UpdateSourceTrigger=Explicit}" />
            <Button Content="Explict Now!" Height="32" HorizontalAlignment="Left" Margin="237,243,0,0" Name="button2" VerticalAlignment="Top" Width="103" />
            <TextBox Height="36" HorizontalAlignment="Left" Margin="279,69,0,0" Name="textBox2" VerticalAlignment="Top" Width="133" Text="{Binding ElementName=textBox1, Path=Text, Mode=TwoWay, UpdateSourceTrigger=Explicit}" />
        </Grid>
    </Window>
    
    ==========
    
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace wpff
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                this.Close();
            }
    
            private void Exp_click(object sender, RoutedEventArgs e)
            {//
                textBox1.GetBindingExpression(TextBox.TextProperty).UpdateSource();
            }
    
            
    
            
        }
    }
    

    יום שני 14 מאי 2012 12:07
  • בעת לחיצה על הכפתור אני רוצה שתיבת הטקסט textBox2, תעדכן את המקור שהיא בינדינג אליו - textBox1 

    לכן הקוד הנכון הוא: textBox2.GetBindingExpression(TextBox.TextProperty).UpdateSource();

    (נ.ב. ארוע הלחיצה Exp_Click לא מחובר לכפתור )

    בהצלחה

    • סומן כתשובה על-ידי עמיאל כהן יום שלישי 15 מאי 2012 07:11
    יום שני 14 מאי 2012 13:38
  • כעת עובד !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    כלומר textbox 2 מקבל text מהמקור שלו - textbox1 .  הוא מקבל רק כאשר יש Explict כזה: 

    textBox2.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 

    פירוש : לאובייקט textbox תתבצע עדכון של textproperty מתי שנרשום שורת קוד במפורש . . .

    רק לא ענית לי על השאלה הזו : 

    כאשר אני רוצה להשתמש בתכונה Explict , אוכל לעשות זאת רק אם גם אובייקט המקור , וגם אובייקט היעד - לשניהם יש דרך לעדכן אחד את השני. יצאו הLabel וכו' שאין להם אפשרות לעדכן , את המקור TextBox  במקרה שלנו .  ? ? ? 

    יום שני 14 מאי 2012 14:01
  • הכלל הוא כזה: ניתן לעשות Explicit על פקד שניתן לעדכן אותו והוא binding לכל פקד אחר או לDATA

    בצורה כזאת יש לנו שליטה על התזמון של עדכון המקור שאמור להיות מושפע מפקד זה

    יום שני 14 מאי 2012 14:19