首页 文章

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

提问于
浏览
0

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

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

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

<ComboBox ItemsSource="{Binding PluginNames}" />

GUI的DataContext设置为ViewModel,即

private ViewModel _vm;

public GUI()
{
  InitializeComponent();
  _vm = new ViewModel();
  this.DataContext = _vm;
}

并且ViewModel的OC名为“PluginNames”:

public class ViewModel
{
  public ObservableCollection<string> PluginNames;  // this gets instantiated and added to elsewhere
}

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

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

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

2 回答

  • 4

    看起来你已经暴露了字段而不是属性 . 绑定仅适用于属性...将其更改为:

    public class ViewModel
    {
      public ObservableCollection<string> PluginNames {get; private set;} 
    }
    
  • 6

    当您使用 INotifyPropertyChanged 时,有两件事:

    • 您需要使用属性,而不是字段

    • 设置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
        }
    }
    

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

相关问题