INotifyPropertyChanged Реализовано сейчас что? - PullRequest
1 голос
/ 22 марта 2012

Я пытаюсь создать список, в котором отображается набор данных, которые будут обновляться с течением времени.У меня есть простой список:

<ListBox Name="lbRegisters" ItemsSource="{Binding}" />

И я определил класс для своих объектов:

public class register : INotifyPropertyChanged

{
    private int address;
    public int Address { get { return address; } }

    private int value;
    public int Value
    {
        get{ return value; }
        set{
            this.value = value;

            OnValueChanged("Value");
        }
    }

    public register(int a)
    {
        address = a;
        value = 0;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnValueChanged(string name){
        if (PropertyChanged != null) 
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }

    public override string ToString()
    {
        return address + ": " + value;
    }
}

И я храню их список в ObservableCollection .Затем установите ListBox.ItemsSource = registerslist;в CodeBehind.Список инициализируется, и исходные данные отображаются правильно.

Теперь, что мне нужно сделать, чтобы мой ListBox обновлялся при изменении «register.Value».Обработчик события вызывается, но на событие ничего не подписано.

Я думаю, мне нужно вызвать что-то в ListBox или ObservableCollection, чтобы сообщить GUI об обновлении.Я прочитал десятки постов с похожей проблемой, но все они, похоже, указывают на то, что, как только вы внедрили INotofyPropertyChanged, это просто автоматически работает.

Каков следующий шаг?

Ответы [ 2 ]

3 голосов
/ 22 марта 2012

Проблема в вашей функции ToString().Да, его можно использовать для отображения сложной строки в элементах ListView, но это неправильный способ привязки, поскольку ListView не знает, когда была изменена часть этой строки.

Выполните следующие действия:
1. Объявитесобственность на register класс как

    public string AddressValue
    {
        get { return address + ": " + value; }
    }

2.Добавьте OnValueChanged("AddressValue") в value и address сеттеры, такие как:

public int Value
{
    get{ return value; }
    set{
        this.value = value;

        OnValueChanged("Value");
        OnValueChanged("AddressValue")
    }
}

3.Объявите вас ListBox с ItemTemplate как:

    <ListBox x:Name="lbRegisters" ItemsSource="{Binding}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                    <TextBlock  Text="{Binding AddressValue}"  />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

Таким образом, идея заключается в добавлении нового свойства в класс register, который будет обновляться при изменении address и value.И привязать текст элемента списка к этому свойству.

0 голосов
/ 22 марта 2012

Я думаю, что понимаю дух того, что вы спрашиваете (хотя это, очевидно, незаконченный банкомат). Я бы рекомендовал использовать что-то, что наследуется от DependencyObject, и использовать свойства зависимостей. Используйте фрагмент propdp в Visual Studio. Это сэкономит вам кучу кода и шаблонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...