如何强制刷新WPF绑定?

130

我有一个使用简单绑定附加了项目源的组合框。是否有任何方法可以在组合框加载后刷新此绑定?


1
什么是简单绑定?通常情况下,当您使用绑定时,控件应自动刷新。 - Emond
14
没问题,我相信H.B.应该得到他的答案被采纳的机会,Techee不要介意;-) - Dani
2
@Dani 我不确定Techee是否会回来 - 他已经有六年半没有登录了。 - The Lonely Coder
我并不真正理解正在被询问的是什么。整个集合被改变了吗?还是只有它的内容发生了变化?使用的是何种类型的集合?细节不足。 - StayOnTarget
5个回答

231

您可以使用绑定表达式:

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    ((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
                      .UpdateTarget();
}

但是正如 Blindmeis所指出的,您也可以触发更改通知,如果您的集合实现了INotifyCollectionChanged(例如在ObservableCollection<T>中实现),那么它会同步,因此您不需要执行任何操作。


使用ListBox似乎对我没有任何作用。 - Jonathan Wood
1
@JonathanWood:嗯,我无法猜测你的代码是什么样子的,包括你的绑定是什么样子的。这个绑定是否起作用呢? - H.B.

63

如果您使用了MVVM架构并且您的ItemsSource位于ViewModel中,当您需要刷新时,只需为集合属性调用INotifyPropertyChanged即可。

OnPropertyChanged(nameof(YourCollectionProperty));

11
我认为这是最清晰简洁的方法。 - Boyan
1
尽可能地应该这样做,但需要注意的是,这并不总是切实可行的。例如,如果您要绑定到串口,并想要检查它是否打开、关闭、波特率等,您可以创建一个包装类来实现INotifyPropertyChanged,但您必须将端口保留为该包装器的私有属性,因此需要编写一个属性和方法,以确保在项目中使用其他端口时,您所感兴趣的通知属性始终通过包装器。 - Assimilater
请注意:当列表中添加或删除项目时,这不会更新 UI。对于此场景,您必须使用可观察集合。 - Rankit Dua
如果在添加或删除项后调用OnPropertyChanged(nameof(YourCollectionProperty)); - 它可以工作。但你是对的,Observable Collection已经内置到这个版本中了。 - blindmeis

41

顺便说一下,如果您想使用控件的新值更新数据源,您需要调用UpdateSource()而不是UpdateTarget()

((TextBox)sender).GetBindingExpression(TextBox.TextProperty).UpdateSource();

10

多绑定友好版本...

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    BindingOperations.GetBindingExpressionBase((ComboBox)sender, ComboBox.ItemsSourceProperty).UpdateTarget();
}

6

尝试使用BindingExpression.UpdateTarget()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接