属性更改后列表框不刷新

Posted

技术标签:

【中文标题】属性更改后列表框不刷新【英文标题】: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" />

ApplicationsEventsWindow 类中的公共属性。

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

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

然后在将新项目添加到ApplicationsEvents 之后,我调用:

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

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

【问题讨论】:

【参考方案1】:

问题是您的属性值没有改变。它仍然是相同的列表,相同的参考。

一种解决方案可能是您的集合是ObservableCollection 类型。这些列表在您添加或删除项目时为 WPF 提供事件。

【讨论】:

【参考方案2】:

让我们看看其中一个 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 中使用“简单”绑定语法,我通常将 Window 中的 DataContext(或文件的根 Control 元素,无论我在做什么)更改为

<Window DataContext="Binding RelativeSource=RelativeSource Self" ... >
   ...

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

【讨论】:

谢谢。它可以工作,但必须在 Binding 中设置列​​表框 datacontext=this 或 ElementName=window。 你不需要让你的集合绑定到一个依赖属性——只要它是一个 ObservableCollection 并且集合中的类型实现了 INotifyPropertyChanged

以上是关于属性更改后列表框不刷新的主要内容,如果未能解决你的问题,请参考以下文章

绑定数据更改时Winforms列表框不更新

怎么更改vb中label标签文字的大小

更改双列表框中单击选项的背景颜色

用matlab编列表框,在窗口中设置一个列表框,若双击某行,弹出第二个窗口,显示内容,按返回则返回

怎样用css设定下表框的宽度、样式、颜色

excel怎样做交互式图表