19

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

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

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

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

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

谢谢

4

3 回答 3

25

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

它是通过调用实现的:

CollectionViewSource.GetDefaultView(your_collection_name).Refresh();

这在不改变集合的情况下刷新了视图模型中的视图

于 2016-04-23T13:23:26.583 回答
24

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

如果您确实需要在您的集合没有任何更改时触发 UI 更新,那么执行此操作的方法是手动引发CollectionChanged事件。这不能按ObservableCollection<>原样完成,但您可以从该类派生一个新集合,并protected OnCollectionChanged从某个新方法中调用该public方法。

于 2012-05-08T20:05:17.467 回答
2

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

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

用法:

myCollection.Refresh();
于 2021-04-29T09:38:42.403 回答