【问题标题】:ListBox doesn't refresh after property changed属性更改后列表框不刷新
【发布时间】:2010-11-10 13:41:42
【问题描述】:

我正在尝试绑定两个ListBoxes:

<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 只加载了一次。我做错了什么?

【问题讨论】:

    标签: wpf data-binding 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
      猜你喜欢
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 2014-08-15
      • 2018-08-08
      • 2023-03-03
      相关资源
      最近更新 更多