wpf - 使用 INotifyPropertyChanged 而不是 DependencyProperties 进行数据绑定(bind)

标签 wpf mvvm inotifypropertychanged dependency-properties

一个多星期以来,我一直在努力让数据绑定(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 时,有两点:

  • 您需要使用属性,而不是字段
  • 设置 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
        }
    }
    

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

    关于wpf - 使用 INotifyPropertyChanged 而不是 DependencyProperties 进行数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1976560/

    相关文章:

    c# - 如何绑定(bind)静态BitmapSource?

    WPF TreeView 不显示箭头

    c# - INotifyPropertyChanged 绑定(bind)到 GridColumn 中的 DataTemplate

    c# - 在不更新 UI 元素的代码中定义的 WPF 数据绑定(bind)问题

    c# - 如何在 WPF 中改变 Canvas 的位置?

    wpf按钮点击

    wpf - DataTemplate 内的 ContentControl 两种方式绑定(bind)不起作用?

    c# - WPF 绑定(bind) ListView ItemContainerStyle 的背景

    Silverlight:如何将 List<T> 绑定(bind)到数据网格

    c# - 具有 ObservableCollection 和 INotifyPropertyChange 的 Json.Net 类层次结构被序列化但未反序列化