我正在尝试绑定两个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
到两个列表框并在INotifyPropertyChanged
类中实现Window
:
private void NotifyPropertyChanged(string info)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
然后在将新项目添加到Applications
或Events
后,我致电:
NotifyPropertyChanged("Events");
NotifyPropertyChanged("Applications");
问题是ListBox
只加载一次。我做错了什么?
答案 0 :(得分:11)
让我们看看其中一个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中使用“简单”绑定语法,我通常会将窗口中的DataContext
(或文件的根控件元素,无论我在哪里工作)更改为
<Window DataContext="{Binding RelativeSource={RelativeSource Self}}" ... >
...
您的应用程序框将自动更新。
答案 1 :(得分:3)
问题是您的属性值没有改变。它仍然是相同的列表,相同的参考。
一个解决方案可能是您的集合属于ObservableCollection
类型。这些列表在您添加或删除项目时为WPF提供事件。