一个多星期以来,我一直在努力让数据绑定(bind)在 WPF 中工作。我确实在这里获得了有关 DataContext 的宝贵帮助,并且我确实通过 DependencyProperties 使数据绑定(bind)工作。在学习数据绑定(bind)时,我遇到了很多关于 INotifyPropertyChanged
的讨论。以及它在很多方面都比 DP 更好。我想我会试一试。
我正在使用 Josh Smith 的基本 ViewModel 类,而我的 ViewModel 就是从它派生的。但是,我在让数据绑定(bind)工作时遇到了一些麻烦,希望这里有人能告诉我哪里出错了。
在我的 ViewModel 类中,我有一个 ObservableCollection<string>
.在我的 GUI 中,我有一个绑定(bind)到此 OC 的组合框,即
<ComboBox ItemsSource="{Binding PluginNames}" />
GUI 的 DataContext 设置为 ViewModel,即
private ViewModel _vm;
public GUI()
{
InitializeComponent();
_vm = new ViewModel();
this.DataContext = _vm;
}
并且 ViewModel 具有名为“PluginNames”的 OC:
public class ViewModel
{
public ObservableCollection<string> PluginNames; // this gets instantiated and added to elsewhere
}
加载 GUI 时,会调用一个方法来实例化 OC 并向其添加插件名称。修改OC后,我调用
RaisePropertyChanged( "PluginNames")
.我期待,因为 WPF 数据绑定(bind)模型认识到 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
}
}
这应该会导致一切重新填充。
关于wpf - 使用 INotifyPropertyChanged 而不是 DependencyProperties 进行数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1976560/