2009-12-29 89 views
0

我一直在争取让数据绑定在WPF中工作一个多星期。我在这里获得了关于DataContext的宝贵帮助,并且我确实通过DependencyProperties获得了数据绑定。在我学习数据绑定的同时,我遇到了许多关于INotifyPropertyChanged的讨论,以及它在很多方面比DP更好。我想我会试一试并尝试一下。使用INotifyPropertyChanged而不是DependencyProperties进行数据绑定

我使用乔希史密斯的基础ViewModel类和我的ViewModel派生自它。但是,我在数据绑定工作方面遇到了一些麻烦,希望有人能告诉我哪里出错了。

在我的ViewModel类中,我有一个ObservableCollection<string>。在我的GUI,我有一个绑定到该OC组合框,即

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

的GUI的DataContext设置为视图模型,即

private ViewModel _vm; 

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

和视图模型具有名为OC“PluginNames” :

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

当加载GUI时,会调用一个方法来实例化OC并向其添加插件名称。 OC被修改后,我致电RaisePropertyChanged("PluginNames")。我期待着,因为WPF数据绑定模型认识到INotifyPropertyChanged,这就是我需要做的一切,它会“神奇地工作”,并使用已加载的插件更新组合框项目......但事实并非如此。

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

更新:我不知道为什么,但现在,而不是做任何明显的更新,它没有找到属性。我认为我很愚蠢,并且在某个地方失去了重要的一步。

回答

4

看起来你已经暴露了领域而不是财产。绑定适用于只是性能......将它改为:

public class ViewModel 
{ 
    public ObservableCollection<string> PluginNames {get; private set;} 
} 
+1

请勿使用自动属性 ​​- 它们不会引发PropertyChanged事件。 – itowlson 2009-12-29 19:56:38

+0

绝对正确。哎呀!我最终会在这件事上变得更好。 :) – Dave 2009-12-29 19:57:20

+0

在这里接受最古老的正确答案是正确的礼节吗?我假设如此。 – Dave 2009-12-29 19:58:11

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 
    } 
} 

这应该引起一切重新填充。

+2

事实上,可能没有理由在该属性上设置一个setter,因为它是一个集合(并且是可观察的集合)。 – 2009-12-29 19:55:45

+0

哦jeez。那就对了!谢谢。对不起,我的愚蠢。 – Dave 2009-12-29 19:56:00

+1

是的 - 但他故意提到他是在运行时设置它,所以我将其包含在内。 – 2009-12-29 20:03:25

相关问题