更新ListBox中的项目

时间:2009-06-29 20:32:27

标签: c# wpf mvvm binding viewmodel

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

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

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

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

有什么建议吗?

3 个答案:

答案 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可能有与滚动模具相关的数据及其最后一个滚动的值,因此它会在其自身属性发生变化时发送通知。