2

我有一个 ListBox 绑定到 DiceViewModel 的可观察集合。每当我单击按钮添加新项目时,ListBox 都会按预期显示新项目。到目前为止,一切都运行良好。

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

但是,我还有另一个按钮可以滚动所有现有的骰子。框中已列出的项目不会更新,我不确定如何在保持 MVVM 设计模式的同时强制执行此操作。

另外,我的 DiceViewModel 已经实现了 INotifyPropertyChanged。

有什么建议么?

4

3 回答 3

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 事件。

我希望这可以帮助其他一些人了解这个记录不充分的功能。

于 2009-06-29T22:01:25.710 回答
0

In the case of ObservableCollection INotifyPropertyChanged will only notify on changes to the structure of the collection, generally this is the addition and removal of items. The collection has no knowledge of changes to the properties of an individual item within the collection. Instead that individual item itself is responsible for sending notification of its properties changing.

The reasoning behind this goes back to class responsibility and separation of concerns. Since the DiceViewModel likely has data related rolling a die and the value of its last roll then it would follow that it would send notification when its own properties change.

于 2009-06-30T01:55:37.827 回答
0

您需要在项目绑定到的集合上实现 INotifyCollectionChanged 接口,然后让它触发 CollectionChanged 事件以指示集合已更改。

这将导致整个列表的刷新。

于 2009-06-29T20:35:48.613 回答