У меня есть ListBox, связанный с наблюдаемой коллекцией DiceViewModel. Всякий раз, когда я нажимаю кнопку, чтобы добавить новый элемент, ListBox отображает новый элемент, как я ожидаю. Все до сих пор хорошо работает.
<ListBox
ItemsSource="{Binding Path=AllDice}"
DisplayMemberPath="Value"/>
Однако у меня есть еще одна кнопка, чтобы свернуть все существующие кости. Элементы, которые уже указаны в поле, не обновляются, и я не уверен, как это сделать, сохраняя шаблон дизайна MVVM.
Кроме того, мой DiceViewModel уже реализует INotifyPropertyChanged.
Любые предложения?
После того, как мы снова погуляем, вот что я нашел. 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.
Я надеюсь, что это поможет некоторым другим людям с этой плохо документированной функцией.
В случае ObservableCollection INotifyPropertyChanged будет уведомлять только об изменениях в структуре коллекции, как правило, это добавление и удаление элементов. Коллекция не знает изменений в свойствах отдельного элемента в коллекции. Вместо этого сам отдельный элемент отвечает за отправку уведомления об изменении его свойств.
Обоснование этого сводится к классовой ответственности и разделению проблем. Поскольку у DiceViewModel, вероятно, есть данные, связанные с прокатом штампа и значением его последнего рулона, тогда он будет следить за тем, чтобы он отправил уведомление, когда изменились его собственные свойства.
Вам необходимо реализовать интерфейс INotifyCollectionChanged в коллекции, к которому привязаны элементы, а затем запустить событие CollectionChanged, чтобы указать, что коллекция была изменена.
Это приведет к обновлению всего списка.