无法让 ListBox 和 UpdateTarget 工作

Posted

技术标签:

【中文标题】无法让 ListBox 和 UpdateTarget 工作【英文标题】:Can't get ListBox and UpdateTarget to work 【发布时间】:2010-11-27 07:33:34 【问题描述】:

以下是 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 并希望 ListBox 反映更改。 这是我想使用但不起作用的代码:

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

此代码可以代替:

myList.ItemsSource = null;
myList.ItemsSource = MyClass.dic.Keys;

我更喜欢使用 UpdateTarget,但我无法让它工作。 我做错了什么?

【问题讨论】:

【参考方案1】:

项目绑定的处理方式与 WPF 中 DependencyPropertys 的标准绑定不同(特别是 ItemsControls)。

我认为您想要以下内容:

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

实际上是您要刷新的ICollectionView 对象。这实际上是为您管理集合绑定的对象。请参阅the MSDN page 了解更多信息。

【讨论】:

【参考方案2】:

扩展 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 替换为正确的值。每当您的对象上的属性发生更改时,这将自动更新您的视图。我不确定为什么不自动处理这件事,但我无法弄清楚如何设置。

【讨论】:

以上是关于无法让 ListBox 和 UpdateTarget 工作的主要内容,如果未能解决你的问题,请参考以下文章

如何将ListBox绑定到返回键以关闭窗口

如何让 ListBox ItemTemplate 水平拉伸 ListBox 的整个宽度?

如何将urwid.BigText放入urwid.ListBox

让 ListBox 中的项目取决于在 ComboBox 中选择了哪个项目

如何让 ListBox 刷新其项目文本?

程序不会让我以任何方式清除我的 listBox [C#, WinForms]