我有一个列表框,其中的项目绑定到ObservableCollection。
现在,在viewModel中,我需要更新UI。 我没有从我的视图模型中引用列表框。
如果我从我的ObservableCollection中删除或添加一个项目,则ui会更新。
基于其他一些逻辑我需要更新UI ...但是ObservableCollection是相同的。
如何在不添加或删除ObservableCollection中的项目的情况下更新UI?
由于
答案 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();