如何使用ObservableCollection从ViewModel刷新UI?

时间:2012-05-08 19:56:03

标签: c# wpf mvvm

我有一个列表框,其中的项目绑定到ObservableCollection。

现在,在viewModel中,我需要更新UI。 我没有从我的视图模型中引用列表框。

如果我从我的ObservableCollection中删除或添加一个项目,则ui会更新。

基于其他一些逻辑我需要更新UI ...但是ObservableCollection是相同的。

如何在不添加或删除ObservableCollection中的项目的情况下更新UI?

由于

3 个答案:

答案 0 :(得分:15)

如果您因为编辑了集合中的项而需要更改UI,那么您应该安排这些项目来实现INotifyPropertyChanged界面。如果集合中的对象具有PropertyChanged事件,则UI将从单个项目中侦听该事件。 (如果可能,您还可以使用DependencyObjects将集合中的项目更改为DependencyProperties,从而实现相同的目标。)

如果确实需要在什么都没有关于您的收藏时更改时触发UI更新,那么执行此操作的方法是手动提升{{1}事件。这不能用CollectionChanged原样完成,但您可以从该类派生一个新集合,并从一些新的ObservableCollection<>方法中调用protected OnCollectionChanged方法。

答案 1 :(得分:12)

我有一个类似的问题,我想改变一个项目的背景,但显然项目和集合都没有改变。

通过致电:

实现
CollectionViewSource.GetDefaultView(your_collection_name).Refresh();

这会从视图模型刷新视图而不更改集合

答案 2 :(得分:1)

这是扩展方法的一个很好的例子。它隐藏了实现,以防在未来版本中发生变化,可以在一个地方修改,并且调用代码看起来更简单,更容易混淆。

public static void Refresh<T>(this ObservableCollection<T> value)
{
    CollectionViewSource.GetDefaultView(value).Refresh();
}

用法:

myCollection.Refresh();