Обновление элементов внутри ListBox

2

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

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

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

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

Любые предложения?

Теги:
wpf
binding
mvvm
viewmodel

3 ответа

4
Лучший ответ

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

Однако есть способ сделать это в файле 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.

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

  • 2
    Вероятно, это связано с тем, что в шаблоне по умолчанию используется ToString, и вы не можете наблюдать за изменениями в ToString, поскольку это метод. Хороший пикап.
  • 0
    Вы знаете, я вернулся и провел несколько экспериментов. Я удалил все вещи из DataTemplate и вернулся к исходному простому коду ..... И он все еще работает. Я не совсем уверен, почему это не удалось в первую очередь. В то же время, где-то во время поиска я случайно исправил свою первоначальную проблему и подумал, что содержание этого поста решило ее.
0

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

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

0

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

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

  • 0
    Что ж, ObservableCollection, который я использую, реализует INotifyCollectionChanged, а ListBox добавляет новые записи, когда я добавляю элементы, но не обновляет отображаемые значения, когда содержимое данных базового элемента.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню