Обновление элементов внутри ListBox - PullRequest
2 голосов
/ 30 июня 2009

У меня есть ListBox, связанный с наблюдаемой коллекцией DiceViewModel. Всякий раз, когда я нажимаю кнопку, чтобы добавить новый элемент, ListBox отображает новый элемент, как я ожидал. Пока все работает хорошо.

<ListBox
  ItemsSource="{Binding Path=AllDice}"
  DisplayMemberPath="Value"/>

Однако у меня есть еще одна кнопка, чтобы бросить все существующие кости. Элементы, уже перечисленные в поле, не обновляются, и я не уверен, как применить это при соблюдении шаблона проектирования MVVM.

Кроме того, моя DiceViewModel уже реализует INotifyPropertyChanged.

Есть предложения?

Ответы [ 3 ]

4 голосов
/ 30 июня 2009

После еще нескольких копаний вот что я нашел. ObservableCollection не регистрируется автоматически с событием INotifyPropertyChanged моего DiceViewModel. Поэтому любые изменения свойств не обрабатываются.

Однако, есть способ сделать это в файле xaml:

Я добавил это определение пространства имен в свой элемент Window.

xmlns:vm="clr-namespace:Rolling.ViewModel"

Затем я изменил свой ListBox для использования DataTemplate с указанным DataType:

<ListBox ItemsSource="{Binding Path=AllDice}">
  <ListBox.Resources>
    <DataTemplate DataType="{x:Type vm:DiceViewModel}">
      <TextBlock Text="{Binding Path=Value}"/>
    </DataTemplate>
  </ListBox.Resources>
</ListBox>

С указанным DataType ObservableCollection может зарегистрировать себя в элементах моей коллекции, получить их события, а затем запустить собственное событие CollectionChanged.

Надеюсь, это поможет другим людям с этой плохо документированной функцией.

0 голосов
/ 30 июня 2009

В случае ObservableCollection INotifyPropertyChanged будет уведомлять только об изменениях в структуре коллекции, как правило, это добавление и удаление элементов. Коллекция не знает об изменениях свойств отдельного элемента в коллекции. Вместо этого этот отдельный элемент сам отвечает за отправку уведомления об изменении его свойств.

Причина этого восходит к классовой ответственности и разделению интересов. Поскольку DiceViewModel, скорее всего, имеет данные, связанные с броском матрицы, и значением его последнего броска, из этого следует, что он будет отправлять уведомление, когда изменяются его собственные свойства.

0 голосов
/ 30 июня 2009

Необходимо реализовать интерфейс INotifyCollectionChanged в коллекции, к которой привязаны элементы, а затем запустить событие CollectionChanged, чтобы указать, что коллекция изменилась.

Это приведет к обновлению всего списка.

...