c# - реализация - wpf binding




Проблема с привязкой данных WPF, определенной в коде, не обновляющем элементы пользовательского интерфейса (4)

Мне нужно определить новые элементы пользовательского интерфейса, а также привязку данных в коде, потому что они будут реализованы после выполнения. Вот упрощенная версия того, что я пытаюсь сделать.

Модель данных:

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 в книге, но текстовый блок не обновляется. Может ли кто-нибудь сказать мне, почему?

Спасибо, Бен


Вам нужно установить режим привязки программно? Он может не соответствовать OneTime.


Вы уверены, что обновляете тот же объект, что и в привязке? На первый взгляд ничего не получается, поэтому проверьте простые вещи. :)


Любой код обходит свойство, задавая поле ( _houseNumber ) напрямую?


Убедитесь, что вы обновляете ссылку AddressBook которая использовалась в привязке, а не какую-либо другую ссылку 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();
    }
}

Обратите внимание, что в коде обновления используется одна и та же ссылка.







inotifypropertychanged