【问题标题】:List<> collection does not update the View in MVVMList<> 集合不会更新 MVVM 中的视图
【发布时间】:2012-05-22 19:40:31
【问题描述】:

我使用List&lt;Person&gt; collection 作为 DataGrid 控件的 ItemsSource。

但如果我从列表集合中删除项目,它不会更新视图。我为解决方案苦苦挣扎了很长时间。

然后代替我的 ViewModel 中的 List&lt;Person&gt; 集合。我把它改成了ObservableCollection&lt;Person&gt; collection。现在它会在集合发生变化时更新视图。

我不知道为什么它只更新 ObservableCollection&lt;Person&gt; ?有人吗?

【问题讨论】:

标签: wpf mvvm


【解决方案1】:

嗯,它的名字。一个简单的列表不会告诉 ui 更新,换句话说“视图无法观察列表”。数据绑定背后没有奇怪的魔法。 WPF 和 DataBinding 需要 Data 模型告诉他们“这是新的”或“这是已更改的”,您可能已经看到 INotifyPropertyChangedINotifyCollectionChanged 相同,但对于集合,List&lt;&gt; 没有实现它, ObservableCollection 会。

【讨论】:

    【解决方案2】:

    因为List没有实现INotifyCollectionChanged

    【讨论】:

      【解决方案3】:

      因为数据绑定的更新不是一种魔法,所以要使数据绑定正常工作有几个要求。如果您有单个属性要绑定在此属性上,则该属性必须是依赖属性或其父类必须实现 INotifyPropertyChanged 接口以通知 wpf 绑定系统有关属性值的更改。 对于集合有一个类似的机制:它必须实现 INotifyPropertyChanged 以通知 wpf 绑定系统有关已删除/移动/添加的项目。

      更多详情请看这里:http://msdn.microsoft.com/en-us/library/system.collections.specialized.inotifycollectionchanged.aspx

      【讨论】:

        【解决方案4】:

        ObservableCollection&lt;T&gt; 每次更改集合中的项目时都会触发更改事件。 List&lt;T&gt; 没有。这就是原因。

        DataBinding 是惰性的。如果您不告诉您的视图某些内容发生了变化,它就不会打扰更新。在后台,WPF DataBinding 注册更改通知,以便您的 ViewModel 可以在视图发生更改时告知视图。它使用INotifyPropertyChangedINotifyCollectionChanged 等接口来实现这一点。

        ObservableCollection&lt;T&gt; 实现了接口INotifyCollectionChanged。这个接口定义了事件CollectionChanged,你的视图基本上附加了它自己的事件处理程序。该处理程序将在集合引发事件时更新视图。

        【讨论】:

          猜你喜欢
          • 2017-05-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-20
          相关资源
          最近更新 更多