我一直在努力让数据绑定在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,这就是我需要做的所有事情,它将“神奇地工作”并使用已加载的插件更新组合框项目......但事实并非如此。 / p>
有人可以指出我在这里做错了吗?谢谢!
更新:我不知道为什么,但现在没有做任何明显的更新,它根本找不到属性。我想我真的很蠢,在某个地方错过了一个重要的步骤。
答案 0 :(得分:6)
当您使用INotifyPropertyChanged
时,有两件事:
你想要重做这件事,看起来更像是:
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
}
}
这应该导致一切都重新填充。
答案 1 :(得分:4)
看起来你已经暴露了字段而不是属性。绑定仅适用于属性...将其更改为:
public class ViewModel
{
public ObservableCollection<string> PluginNames {get; private set;}
}