属性更改后列表框不刷新
Posted
技术标签:
【中文标题】属性更改后列表框不刷新【英文标题】:ListBox doesn't refresh after property changed 【发布时间】:2010-11-10 13:41:42 【问题描述】:我正在尝试绑定两个ListBox
es:
<ListBox SelectionChanged="lbApplications_SelectionChanged"
ItemsSource="Binding Path=Applications,
UpdateSourceTrigger=PropertyChanged, Mode=OneWay" />
<ListBox DisplayMemberPath="Message"
ItemsSource="Binding Path=Events,
UpdateSourceTrigger=PropertyChanged, Mode=OneWay" />
Applications
和 Events
是 Window
类中的公共属性。
我将DataContext
设置为this
到两个列表框并在Window
类中实现INotifyPropertyChanged
:
private void NotifyPropertyChanged(string info)
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(info));
然后在将新项目添加到Applications
或Events
之后,我调用:
NotifyPropertyChanged("Events");
NotifyPropertyChanged("Applications");
问题是ListBox
只加载了一次。我做错了什么?
【问题讨论】:
【参考方案1】:问题是您的属性值没有改变。它仍然是相同的列表,相同的参考。
一种解决方案可能是您的集合是ObservableCollection
类型。这些列表在您添加或删除项目时为 WPF 提供事件。
【讨论】:
【参考方案2】:让我们看看其中一个 ListBox,因为它们基本上是相同的。
我们关心的代码是这样的:
<ListBox ItemsSource="Binding Path=Applications,
UpdateSourceTrigger=PropertyChanged, Mode=OneWay" />
由于您是 WPF 的新手,所以我说您可能不需要 UpdateSourceTrigger
或 Mode
,这给我们留下了这样的信息:
<ListBox ItemsSource="Binding Path=Applications" />
您提到应用程序是您的代码隐藏中的公共属性。你需要它是DependencyProperty
,并且你需要它在它发生变化时触发事件——大多数人为此使用ObservableCollection。
所以你的代码隐藏会有一些东西像这样:
public ObservableCollection<string> Applications
get return (ObservableCollection<string>)GetValue(ApplicationsProperty);
set SetValue(ApplicationsProperty, value);
public static readonly DependencyProperty ApplicationsProperty =
DependencyProperty.Register("Applications",
typeof(ObservableCollection<string>), typeof(Window1),
new UIPropertyMetadata(null));
然后,在你想添加它的地方,你会做这样的事情:
this.Applications = new ObservableCollection<string>();
Applications.Add("Whatever");
最后,为了在 XAML 中使用“简单”绑定语法,我通常将 Window 中的 DataContext
(或文件的根 Control 元素,无论我在做什么)更改为
<Window DataContext="Binding RelativeSource=RelativeSource Self" ... >
...
您的应用程序框将自动更新。
【讨论】:
谢谢。它可以工作,但必须在 Binding 中设置列表框 datacontext=this 或 ElementName=window。 你不需要让你的集合绑定到一个依赖属性——只要它是一个 ObservableCollection 并且集合中的类型实现了 INotifyPropertyChanged以上是关于属性更改后列表框不刷新的主要内容,如果未能解决你的问题,请参考以下文章