如何强制WPF绑定刷新?

Tec*_*hee 104 c# data-binding wpf

我有一个使用简单绑定附加项目源的组合框.一旦加载了组合框,有没有办法刷新这个绑定?

H.B*_*.B. 189

您可以使用绑定表达式:

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    ((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
                      .UpdateTarget();
}
Run Code Online (Sandbox Code Playgroud)

正如Blindmeis所指出的那样,你也可以发送更改通知,如果你的集合实现INotifyCollectionChanged(例如在其中实现ObservableCollection<T>),它将同步,所以你不需要做任何这些.

  • 这怎么不被接受作为答案? (7认同)
  • @Will OP已经走了5年. (7认同)

bli*_*eis 53

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

OnPropertyChanged("YourCollectionProperty");
Run Code Online (Sandbox Code Playgroud)

  • 这是最简洁的方法. (7认同)
  • 另外,我很喜欢使用`nameof(YourCollectionProperty)`而不是文字字符串.这可以防止错误重构,并且更明确实际意图.这当然是你不能使用更好的`CallerMemberName`属性 (4认同)

dot*_*NET 28

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

((TextBox)sender).GetBindingExpression(ComboBox.TextProperty).UpdateSource();
Run Code Online (Sandbox Code Playgroud)


Tem*_*eck 8

MultiBinding友好版......

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    BindingOperations.GetBindingExpressionBase((ComboBox)sender, ComboBox.ItemsSourceProperty).UpdateTarget();
}
Run Code Online (Sandbox Code Playgroud)


Kus*_*kar 6

尝试使用 BindingExpression.UpdateTarget()