属性更改后,ListBox不会刷新

Jan*_*nda 6 data-binding wpf listbox

我试图绑定两个ListBoxes:

<ListBox SelectionChanged="lbApplications_SelectionChanged"
         ItemsSource="{Binding Path=Applications, 
                       UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />
<ListBox DisplayMemberPath="Message" 
         ItemsSource="{Binding Path=Events, 
                       UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />
Run Code Online (Sandbox Code Playgroud)

Applications并且EventsWindow课堂上的公共财产.

我设置DataContextthis两个列表框并INotifyPropertyChangedWindow课堂上实现:

 private void NotifyPropertyChanged(string info)
 {
   if (PropertyChanged != null)
     PropertyChanged(this, new PropertyChangedEventArgs(info));
 }
Run Code Online (Sandbox Code Playgroud)

之后添加新项目ApplicationsEvents我致电:

 NotifyPropertyChanged("Events");
 NotifyPropertyChanged("Applications");
Run Code Online (Sandbox Code Playgroud)

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

exc*_*lsr 11

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

我们关注的代码是这样的:

<ListBox ItemsSource="{Binding Path=Applications, 
                           UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />
Run Code Online (Sandbox Code Playgroud)

既然你是WPF的新手,请允许我说你可能不需要UpdateSourceTrigger或者Mode在那里,这让我们知道:

<ListBox ItemsSource="{Binding Path=Applications}" />
Run Code Online (Sandbox Code Playgroud)

您提到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));
Run Code Online (Sandbox Code Playgroud)

然后,在你想要添加的地方,你会做这样的事情:

this.Applications = new ObservableCollection<string>();
Applications.Add("Whatever");
Run Code Online (Sandbox Code Playgroud)

最后,为了在XAML中使用"简单"绑定语法,我通常会DataContext在我的窗口(或文件的根控件元素,无论我在做什么)中更改为

<Window DataContext="{Binding RelativeSource={RelativeSource Self}}" ... >
   ...
Run Code Online (Sandbox Code Playgroud)

您的应用程序框将自动更新.

  • 您不需要使您的集合绑定到依赖项属性 - 只要它是一个ObservableCollection并且集合中的类型实现INotifyPropertyChanged (3认同)