使用INotifyPropertyChanged而不是DependencyProperties进行数据绑定

Dav*_*ave 0 wpf dependency-properties mvvm inotifypropertychanged

我一直在努力让数据绑定在WPF中工作一周多一点.我在这里得到了关于DataContext的宝贵帮助,我确实通过DependencyProperties获得了数据绑定.在我学习数据绑定的同时,我INotifyPropertyChanged在很多方面遇到了很多关于它以及如何比DP更好的讨论.我想我会试一试并尝试一下.

我正在使用Josh Smith的基础ViewModel类,我的ViewModel是从它派生的.但是,我在使数据绑定工作时遇到了一些麻烦,我希望有人可以告诉我哪里出错了.

在我的ViewModel类中,我有一个ObservableCollection<string>.在我的GUI中,我有一个与此OC绑定的组合框,即

<ComboBox ItemsSource="{Binding PluginNames}" />
Run Code Online (Sandbox Code Playgroud)

GUI的DataContext设置为ViewModel,即

private ViewModel _vm;

public GUI()
{
  InitializeComponent();
  _vm = new ViewModel();
  this.DataContext = _vm;
}
Run Code Online (Sandbox Code Playgroud)

并且ViewModel的OC名为"PluginNames":

public class ViewModel
{
  public ObservableCollection<string> PluginNames;  // this gets instantiated and added to elsewhere
}
Run Code Online (Sandbox Code Playgroud)

加载GUI时,会调用一个实例化OC并将插件名称添加到其中的方法.OC被修改后,我打电话给RaisePropertyChanged( "PluginNames").我期待由于WPF数据绑定模型认识到INotifyPropertyChanged,这就是我需要做的所有事情,它将"神奇地工作"并使用已加载的插件更新组合框项目......但事实并非如此.

有谁可以指出我在这里做错了什么?谢谢!

更新:我不知道为什么,但现在没有做任何明显的更新,它根本没有找到属性.我想我真的很傻,错过了某个重要的一步.

Ree*_*sey 6

在你工作时INotifyPropertyChanged,有两件事:

  1. 您需要使用属性,而不是字段
  2. 设置hte属性时,应始终引发属性更改事件.

你会想要重做这个看起来更像是:

private ObservableCollection<string> pluginNames;
public ObservableCollection<string> PluginNames
{
    get { return pluginNames; }
    set {
        this.pluginNames = value;
        RaisePropertyChanged("PluginNames"); // This should raise the PropertyChanged event - use whatever your VM class does for this
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该导致一切都重新填充.

  • 事实上,可能没有理由在属性上设置一个setter,因为它是一个集合(以及一个可观察的集合). (2认同)