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,这就是我需要做的所有事情,它将"神奇地工作"并使用已加载的插件更新组合框项目......但事实并非如此.
有谁可以指出我在这里做错了什么?谢谢!
更新:我不知道为什么,但现在没有做任何明显的更新,它根本没有找到属性.我想我真的很傻,错过了某个重要的一步.
在你工作时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
}
}
Run Code Online (Sandbox Code Playgroud)
这应该导致一切都重新填充.