Пользовательский интерфейс обновления WPF при изменении источника привязки - PullRequest
0 голосов
/ 17 августа 2010

У меня есть приложение WPF со списком и контентом управления. Контент управления контентом привязан к списку и имеет табличку с данными, которая отображает текстовое поле, содержимое которого привязано к переменной выбранного элемента в указанном списке. Пока что все работает хорошо, то есть когда я выбираю элемент из списка, содержимое текстового поля изменяется на текущее значение переменной. Однако, если во время выполнения я изменяю значение переменной, текстовое поле не обновляется, пока я не выберу другой элемент списка и затем снова не выберу исходный элемент. Любые идеи о том, что я делаю неправильно или чего мне здесь не хватает? Я думал, что значение текстового поля будет меняться автоматически? Ваша помощь очень ценится.

Вот пример (MainWindow.xaml)

<Grid>
   <ListBox Height="100" HorizontalAlignment="Left" Margin="12,105,0,0" x:Name="listBox1" VerticalAlignment="Top" Width="120" />

   <ContentControl Height="120" HorizontalAlignment="Left" Margin="191,105,0,0" Name="contentControl1" VerticalAlignment="Top" Width="300" ContentTemplate="{DynamicResource MyDataTemplate}" Content="{Binding SelectedItem,ElementName=listBox1}"/>

   <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="202,56,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />

</Grid>

Код C #:

    public MainWindow()
    {
        InitializeComponent();
        listBox1.Items.Add(new MyItem(32));
        listBox1.Items.Add(new MyItem(45));
        listBox1.Items.Add(new MyItem(5));
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        ((MyItem)listBox1.SelectedItem).Value = 4564654;
    }

Дополнительный класс:

public class MyItem
{
    public MyItem(Int32 Value)
    {
        this.Value = Value;
    }

    public Int32 Value { get; set; }
}

И шаблон:

Я уверен, что мне не хватает чего-то вроде уведомления пользовательского интерфейса об изменениях в источнике или вызова обновления каким-либо образом. Это гораздо более упрощенная версия моей реальной проблемы, которая включает элементы управления, метки и т. Д., Которые должны обновляться при изменении источника. Приветствия:)

1 Ответ

5 голосов
/ 17 августа 2010

Ваш класс MyItem, вероятно, должен реализовать интерфейс INotifyPropertyChanged.Когда свойство Value изменяется, вызовите OnPropertyChanged («Value»), чтобы уведомить интерфейс об изменении значения и необходимости его перерисовки.

public class MyItem : INotifyPropertyChanged
{
    public MyItem(Int32 Value)
    {
        this.Value = Value;
    }

    private Int32 _value;
    public Int32 Value 
    { 
        get { return _value; } 
        set { _value = value; OnPropertyChanged("Value"); }
    }
}
...