如何强制 WPF 绑定刷新?

Posted

技术标签:

【中文标题】如何强制 WPF 绑定刷新?【英文标题】:How to force a WPF binding to refresh? 【发布时间】:2011-08-06 06:43:58 【问题描述】:

我有一个组合框,其中包含使用简单绑定附加的项目源。加载组合框后,有什么方法可以刷新此绑定?

【问题讨论】:

简单绑定是什么意思?通常,当您使用绑定时,控件应该会自动刷新。 技术人员,没有冒犯,但我相信 H.B.值得他的回答被接受;-) @Dani 我不确定 Techee 是否会回来 - 自他登录以来已有六年半时间 【参考方案1】:

您可以使用绑定表达式:

private void ComboBox_Loaded(object sender, RoutedEventArgs e)

    ((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
                      .UpdateTarget();

但是as Blindmeis noted 您也可以触发更改通知,如果您的集合实现了INotifyCollectionChanged(例如在ObservableCollection<T> 中实现),它将同步,因此您无需执行任何操作。

【讨论】:

使用 ListBox 似乎对我没有任何帮助。 @JonathanWood:嗯,我不知道你有什么样的代码,包括你的绑定是什么样的。绑定是否一开始就有效?【参考方案2】:

如果您使用 mvvm 并且您的 itemssource 位于您的 vm 中。当您想要刷新时,只需为您的集合属性调用 INotifyPropertyChanged。

OnPropertyChanged("YourCollectionProperty");

【讨论】:

这是最干净的方法恕我直言。 这应该在可能的情况下完成,但应该注意它并不总是实用的。例如,如果您要绑定到串行端口,并且想要检查它是否打开、关闭、波特率等,您可以在实现INotifyPropertyChanged 的串行端口周围创建一个包装类,但您必须保留该包装器的私有端口,因此需要为您在项目其他地方使用的该端口上的所有内容编写属性和方法,以确保您有兴趣通知的属性始终通过包装器 另外,我非常喜欢使用 nameof(YourCollectionProperty) 而不是文字字符串。这可以防止错误重构,并且更明确的实际意图。这当然是你不能使用更好的CallerMemberName 属性的地方【参考方案3】:

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

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

【讨论】:

我更喜欢这个答案。【参考方案4】:

MultiBinding 友好版本...

private void ComboBox_Loaded(object sender, RoutedEventArgs e)

    BindingOperations.GetBindingExpressionBase((ComboBox)sender, ComboBox.ItemsSourceProperty).UpdateTarget();

【讨论】:

【参考方案5】:

尝试使用BindingExpression.UpdateTarget()

【讨论】:

【参考方案6】:

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

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

【讨论】:

This.Bindings.update() 刷新屏幕中的所有绑定。仅供参考 我在 UWP 的一个用户控件中尝试了 this.Bindings.Update() 并且它不存在。 是的。而且 this.Bindings 仍然不存在。 Bindings.Update() 仅在使用已编译绑定 (x:Bind) 的情况下可用...并且已编译绑定仅在 UWP 中可用 请看@MarianDolinský 评论。看起来你必须从 xaml 绑定

以上是关于如何强制 WPF 绑定刷新?的主要内容,如果未能解决你的问题,请参考以下文章

如何刷新 WPF DataGrid?

如何在父组件中强制刷新子组件

wpf中,当DataGrid.ItemsSource与ObservableCollection绑定后,值变化时,DataGrid如何刷新?

WPF中的DataGrid怎么刷新数据

WPF MVVM 文本框文本绑定与 changedText 事件

wpf 多语言对应 切换了 dll后 如何刷新窗体(window)