属性更改后,ListBox不会刷新

时间:2009-07-14 07:23:28

标签: wpf data-binding listbox

我正在尝试绑定两个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}" />

ApplicationsEventsWindow类中的公共属性。

我将DataContext设置为this到两个列表框并在INotifyPropertyChanged类中实现Window

 private void NotifyPropertyChanged(string info)
 {
   if (PropertyChanged != null)
     PropertyChanged(this, new PropertyChangedEventArgs(info));
 }

然后在将新项目添加到ApplicationsEvents后,我致电:

 NotifyPropertyChanged("Events");
 NotifyPropertyChanged("Applications");

问题是ListBox只加载一次。我做错了什么?

2 个答案:

答案 0 :(得分:11)

让我们看看其中一个ListBox,因为它们基本相同。

我们关注的代码是:

<ListBox ItemsSource="{Binding Path=Applications, 
                           UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />

由于您是WPF的新用户,请允许我说您可能不需要UpdateSourceTriggerMode,这样我们就可以了:

<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提供事件。