如何强制WPF绑定刷新?


112

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


1
简单绑定是什么意思?通常,当您使用绑定时,控件应自动刷新。
埃尔诺

12
Techee,没有违法行为,但我相信HB应该得到他的回答;-)
Dani

1
@Dani我不确定Techee是否会回来-自他登录以来已有六年半
The Lonely Coder

Answers:


198

您可以使用绑定表达式:

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

但是正如Blindmeis所述,您还可以触发变更通知,此外,如果您的集合实现INotifyCollectionChanged(例如在中实现ObservableCollection<T>)将同步,则您无需执行任何此类操作。


使用ListBox似乎对我没有做任何事情。
乔纳森·伍德

@JonathanWood:好吧,我无法知道您拥有什么样的代码,包括您的绑定是什么样的。绑定是否一开始就起作用?
HB

56

如果您使用mvvm,并且itemssource位于vm中。要刷新时,只需为您的collection属性调用INotifyPropertyChanged即可。

OnPropertyChanged("YourCollectionProperty");

7
这是恕我直言的最干净的方法。
2015年

应该在可能的情况下执行此操作,但应注意,这并不总是可行的。例如,如果您要绑定到串行端口,并且想要检查它是否打开,关闭,波特率等,则可以围绕实现的串行端口创建包装器类INotifyPropertyChanged,但是必须将端口保持私有状态该包装器,因此需要为您在项目中其他地方使用的该端口上的所有内容编写一个属性和方法,以确保您要通知的属性始终通过包装器
Assimilater

7
另外,我还是使用nameof(YourCollectionProperty)而不是文字字符串的忠实拥护者。这样可以防止错误重构,并且更明确地说明了实际意图。当然,您不能使用CallerMemberName更好的属性
Assimilater

31

要加上2美分,如果您想使用Control的新值更新数据源,则需要调用UpdateSource()而不是UpdateTarget()

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

1
我更喜欢这个答案。
Chopnut

8

MultiBinding友好版本...

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


0

我从后端获取数据,并仅用一行代码更新了屏幕。有效。不确定,为什么我们需要实现接口。(Windows 10,UWP)

    private void populateInCurrentScreen()
    {
        (this.FindName("Dets") as Grid).Visibility = Visibility.Visible;
        this.Bindings.Update();
    }

This.Bindings.update()刷新屏幕上的所有绑定。仅供参考
Itzdsp

我在UWP的用户控件中尝试过this.Bindings.Update(),但它不存在。
詹姆斯·艾什

是。而且this.Bindings仍然不存在。
詹姆斯·艾什

2
Bindings.Update()仅在使用已编译绑定(x:Bind)的情况下可用...已编译绑定仅在UWP中可用
MarianDolinský16年

请看看@MarianDolinský评论。看来您必须绑定xaml
Itzdsp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.