我有一个ListBox绑定到一个可观察的DiceViewModel集合。每当我单击按钮添加新项目时,ListBox就会显示我期望的新项目。到目前为止,一切都运作良好。
<ListBox
ItemsSource="{Binding Path=AllDice}"
DisplayMemberPath="Value"/>
然而,我有另一个按钮来滚动所有现有骰子。框中已列出的项目不会更新,我不确定如何在保持MVVM设计模式的同时强制执行此操作。
另外,我的DiceViewModel已经实现了INotifyPropertyChanged。
有什么建议吗?
答案 0 :(得分:4)
经过多次挖掘,这就是我发现的。 ObservableCollection不会自动注册我的DiceViewModel的INotifyPropertyChanged事件。因此,任何属性更改都无法处理。
但是,有一种方法可以在xaml文件中执行此操作:
我将此命名空间定义添加到我的Window元素。
xmlns:vm="clr-namespace:Rolling.ViewModel"
然后我修改了我的ListBox以使用具有指定DataType的DataTemplate:
<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事件。
我希望这可以帮助其他人处理这个记录不完整的功能。
答案 1 :(得分:0)
您需要在绑定项目的集合上实现INotifyCollectionChanged接口,然后激活CollectionChanged事件以指示集合已更改。
这将导致刷新整个列表。
答案 2 :(得分:0)
在ObservableCollection的情况下,INotifyPropertyChanged只会通知对集合结构的更改,通常这是项目的添加和删除。该集合不知道集合中单个项目的属性的更改。相反,单个项目本身负责发送其属性更改的通知。
这背后的原因可归结为阶级责任和关注点分离。由于DiceViewModel可能有与滚动模具相关的数据及其最后一个滚动的值,因此它会在其自身属性发生变化时发送通知。