属性更改后ListBox不刷新

6

我正在尝试绑定两个 ListBox

<ListBox SelectionChanged="lbApplications_SelectionChanged"
         ItemsSource="{Binding Path=Applications, 
                       UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />
<ListBox DisplayMemberPath="Message" 
         ItemsSource="{Binding Path=Events, 
                       UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />

应用程序事件Window类中的公共属性。

我将DataContext设置为this,并在Window类中实现了INotifyPropertyChanged,同时将其应用于两个列表框:

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

在将新项目添加到应用程序事件后,我调用:

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

问题在于ListBox只加载了一次。我做错了什么?
2个回答

11

让我们只看一个ListBox,因为它们基本上是相同的。

我们关心的代码是这个:

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

既然你是WPF的新手,让我说一下,你可能不需要在那里使用UpdateSourceTriggerMode,这样就只剩下这个了:

<ListBox ItemsSource="{Binding Path=Applications}" />

你在代码后台中提到了 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}}" ... >
   ...

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


谢谢。它可以工作,但只需要将listbox datacontext设置为this或ElementName=window在{Binding}中。 - Jan Remunda
3
只要你的集合是ObservableCollection类型且其中的元素实现了INotifyPropertyChanged接口,就不需要将其绑定到一个依赖属性上。 - flobadob

3
问题在于你的属性值没有改变,仍然是同一个列表,同一个引用。一种解决方法可能是确保你的集合类型是ObservableCollection。这些列表可以为WPF提供添加或移除项时的事件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接