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 具有名为“PluginNames”的 OC:

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

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

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

更新:我不知道为什么,但现在不是没有进行任何明显的更新,而是根本找不到该属性。我认为我真的很愚蠢,并且在某个地方错过了重要的一步。

4

2 回答 2

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

这应该会导致一切重新填充。

于 2009-12-29T19:54:02.647 回答
4

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

public class ViewModel
{
  public ObservableCollection<string> PluginNames {get; private set;} 
}
于 2009-12-29T19:51:26.660 回答