مشكلة مع البيانات WPF ملزم المعرفة في القانون ليس تحديث UI عناصر

StackOverflow https://stackoverflow.com/questions/406526

سؤال

وأنا بحاجة إلى تحديد عناصر واجهة المستخدم الجديدة، وكذلك ربط البيانات في التعليمات البرمجية لأنها سوف تنفذ بعد وقت التشغيل. هنا هو نسخة مبسطة من ما أحاول القيام به.

ونموذج البيانات:

public class AddressBook : INotifyPropertyChanged
{
    private int _houseNumber;
    public int HouseNumber
    {
        get { return _houseNumber; }
        set { _houseNumber = value; NotifyPropertyChanged("HouseNumber"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged(string sProp)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(sProp));
        }
    }
}

والتجليد كود:

AddressBook book = new AddressBook();
book.HouseNumber = 123;
TextBlock tb = new TextBlock();
Binding bind = new Binding("HouseNumber");
bind.Source = book;
bind.Mode = BindingMode.OneWay;
tb.SetBinding(TextBlock.TextProperty, bind); // Text block displays "123"
myGrid.Children.Add(tb);
book.HouseNumber = 456; // Text block displays "123" but PropertyChanged event fires

وعندما يرتبط أولا البيانات، يتم تحديث كتلة النص مع رقم المنزل الصحيح. ثم، إذا قمت بتغيير رقم المنزل في التعليمات البرمجية في وقت لاحق، وقع الحدث PropertyChanged الكتاب، ولكن لا يتم تحديث كتلة النص. يمكن لأحد أن يقول لي لماذا؟

وشكرا، بن

هل كانت مفيدة؟

المحلول

وكان الجذر من أن سلسلة مررت إلى PropertyChangedEventArgs لا تتطابق تماما مع اسم الخاصية. كان لي شيئا من هذا القبيل:

public int HouseNumber
{
    get { return _houseNumber; }
    set { _houseNumber = value; NotifyPropertyChanged("HouseNum"); }
}

وأين يجب أن يكون هذا:

public int HouseNumber
{
    get { return _houseNumber; }
    set { _houseNumber = value; NotifyPropertyChanged("HouseNumber"); }
}

وييكيس! شكرا للدفع في الاتجاه الصحيح.

نصائح أخرى

تأكد من أنك تقوم بتحديث المرجع AddressBook الذي تم استخدامه في الربط، وليس بعض المراجع AddressBook أخرى.

وحصلت على التالي للعمل مع رمز دفتر العناوين الذي أعطيته.

<StackPanel>
    <Button Click="Button_Click">Random</Button>
    <Grid x:Name="myGrid">
    </Grid>
</StackPanel>

ورمز وراء:

public partial class Window1 : Window
{
    private AddressBook book;

    public Window1()
    {
        InitializeComponent();

        book = new AddressBook();
        book.HouseNumber = 13;

        TextBlock tb = new TextBlock();
        Binding bind = new Binding("HouseNumber");
        bind.Source = book;
        tb.SetBinding(TextBlock.TextProperty, bind);
        myGrid.Children.Add(tb);
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Random rnd = new Random();
        book.HouseNumber = rnd.Next();
    }
}

ملاحظة يتم استخدام الإشارة نفسها في رمز التحديث.

هل انت بحاجة الى تعيين وضع ملزمة برمجيا؟ قد يكون تعثر لمرة واحدة.

ولقد مجرد قطع + لصق التعليمات البرمجية (وأضاف قليلا)، وأنه يعمل بشكل جيد بالنسبة لي:

    public Window1()
    {
        InitializeComponent();

        AddressBook book = new AddressBook();
        book.HouseNumber = 123;
        TextBlock tb = new TextBlock();
        Binding bind = new Binding("HouseNumber");
        bind.Source = book;
        bind.Mode = BindingMode.OneWay;
        tb.SetBinding(TextBlock.TextProperty, bind); // Text block displays "123"
        myGrid.Children.Add(tb);
        book.HouseNumber = 456; 
    }

    private void TestButton_Click(object sender, RoutedEventArgs e)
    {
        AddressBook book = 
           (AddressBook(TextBlock)
              myGrid.Children[0])
              .GetBindingExpression(TextBlock.TextProperty)
              .DataItem;

        book.HouseNumber++;
    }

ويعرض 456 عند بدء التشغيل، والنقر فوق الزر يجعل الرقم في زيادة TextBlock على ما يرام.

وربما كنت تبحث في المكان الخطأ لسبب المشكلة؟

هل أنت متأكد أنك تقوم بتحديث نفس موضوع كنت قد استخدمت في الربط؟ في أول وهلة يبدو شيئا خطأ، حتى تحقق أشياء بسيطة. :)

هل أي رمز تجاوز الملكية، وتحديد مجال (_houseNumber) مباشرة؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top