【问题标题】:PropertyChanged doesn't work properlyPropertyChanged 无法正常工作
【发布时间】:2010-06-12 16:24:16
【问题描述】:

我有一个 Silverlight 应用程序,我在其中实现了 MVVM 模式。 在我的应用程序中有一个子窗口,上面有 ComboBox。我将组合框的 ItemsSource 和 SelectedItem 适当地绑定到 MyType 的属性(typeof ObservableCollection)和属性。 MyType 是从 INotifyPropertyChanged 派生的“模型”。当我的窗口被加载时,我为此属性设置了值。但我的组合框不显示所选项目。 我发现当我设置绑定到选定项目的属性时(在 ViewModel 中),PropertyChanged 事件为空。 谁能帮我。谢谢。

【问题讨论】:

  • 描述您的代码不如实际向我们展示您的代码有用。

标签: silverlight mvvm


【解决方案1】:

从您描述的方式来看,唯一绑定的是 ViewModel,而唯一实现 INotifyPropertyChanged 的​​是 MyType。实际上没有任何东西绑定到我的类型的实例来监听它的 PropertyChanged 事件,这就是它为 null 的原因。

听起来您还没有在 ViewModel 上实现 INotifyPropertyChanged。

【讨论】:

    【解决方案2】:

    PropertyChanged 工作正常,所以它必须在您的实现中。简单地实现 INotifyProperty 改变是不够的,你必须明确地调用事件。

    例如,这将不起作用:

    public class Model : INotifyPropertyChanged
    {
        public string Title { get; set; }
    
        public event PropertyChangedEventHandler PropertyChanged;
    }
    

    为了让它工作,你必须提出改变的属性。最简单的方法是将逻辑封装在方法中,如下所示:

    public class Model : INotifyPropertyChanged 
    {
       private string _title;
    
       public string Title
       { 
          get { return _title; }
          set 
          {
             _title = value;
             RaisePropertyChanged("Title");
          }
       }
    
       protected void RaisePropertyChanged(string propertyName) 
       {
          var handler = PropertyChanged;
          if (handler != null)   
          {
             handler(this, new PropertyChangedEventArgs(propertyName));
          }
       }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
    }
    

    当然你可以把事件和方法放在一个基类中继承,这样多个模型就可以利用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 2016-09-01
      • 2012-07-11
      • 2018-04-08
      • 2017-04-20
      • 2018-10-02
      • 2016-09-04
      相关资源
      最近更新 更多