2012-03-22 5 views
1

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

<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, чтобы сообщить графическому интерфейсу обновить. Я прочитал десятки сообщений аналогичной проблемы, но все они, похоже, указывают на то, что после того, как вы внедрили INotofyPropertyChanged, это просто автоматическая работа.

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

+0

Похож на незавершенный вопрос. –

ответ

3

Проблема заключается в вашей функции 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. И привяжите текст элемента списка к этому свойству.

-1

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

Смежные вопросы