无法使ListBox和UpdateTarget工作

6
以下是XAML文件的相关部分:
xmlns:local="clr-namespace:BindingTest"
<ListBox x:Name="myList"
         ItemsSource="{Binding Source={x:Static local:MyClass.Dic},
                               Path=Keys,
                               Mode=OneWay,
                               UpdateSourceTrigger=Explicit}">
</ListBox>

MyClass是一个公共静态类,Dic是一个静态公共属性,即一个Dictionary。

在某个时刻,我向Dictionary中添加了项,并希望ListBox反映出这些更改。
这是我考虑使用的代码,但它无法工作:

BindingExpression binding;
binding = myList.GetBindingExpression(ListBox.ItemsSourceProperty);
binding.UpdateTarget();

这段代码可以正常工作:
myList.ItemsSource = null;
myList.ItemsSource = MyClass.dic.Keys;

我更愿意使用UpdateTarget,但我无法让它正常工作。
我做错了什么?

2个回答

12

在WPF中,与DependencyProperty的标准绑定方式(特别是由ItemsControls处理)不同,项的绑定方式有所不同。

我认为你想要像下面这样的东西:

var itemsView = CollectionViewSource.GetDefaultView(myListBox.ItemsSource);
itemsView.Refresh()

实际上,您需要刷新的是 ICollectionView 对象。这个对象有效地管理着集合绑定。请参见MSDN页面获取更多信息。


0

延伸Noldorin的先前答案,您可以挂钩到PropertyChanged事件,以使每当更新您的模型时自动发生此操作:

public partial class YourView {
  public YourView () {
    InitializeComponent();
    ViewModel=YourDataObject;
    ViewModel.PropertyChanged+=OnUpdateYourDataObject;
  }
  public YourDataObject? ViewModel {
    get => DataContext as YourDataObject;
    set => DataContext=value;
  }
  public void OnUpdateYourDataObject(object? sender, PropertyChangedEventArgs? e) => 
        CollectionViewSource.GetDefaultView(YourListBox.ItemsSource).Refresh();
 }

将YourDataObject和YourListBox替换为正确的值。每当对象上的属性更改时,这将自动更新您的视图。我不确定为什么这不是自动处理的,但我无法找到设置使其工作。


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