无法让 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 中 DependencyProperty
s 的标准绑定不同(特别是 ItemsControl
s)。
我认为您想要以下内容:
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 ItemTemplate 水平拉伸 ListBox 的整个宽度?
如何将urwid.BigText放入urwid.ListBox