【问题标题】:How to enable property change for data binding?如何启用数据绑定的属性更改?
【发布时间】:2011-09-20 15:46:57
【问题描述】:

假设我有实现 INotifyPropertyChange 的 VM:

public class MyViewModel{
  public MyClass{get;set;}
  ...
}

但是普通类 MyClass 没有实现 INotifyPropertyChange,它只包含一些属性,例如:

public class MyClass
    {
        public MyClass()
        {
        }
        public string P1 { get; set; }
    ... 
    }

在 xaml 中,DataContext 是 MyViewModel。我将绑定设置为:

Text = "{Binding MyClass.P1}"

然后在 MyViewModel 构造函数中,我设置了 MyClass 的实例并触发属性更改,如

this.RaisePropertyChanged("MyClass");

但 P1 的值不会显示在 UI 中。在这种情况下如何实现类似 this.RaisePropertyChanged("MyClass.P1") ?

【问题讨论】:

  • public MyClass{get;set;} 不会编译。

标签: c# silverlight mvvm


【解决方案1】:

你不能。
您需要在拥有该属性的类中实现INotifyPropertyChanged

如果您不能使该类实现INotifyPropertyChanged,您应该创建一个单独的 ViewModel 类来包装它并实现INotifyPropertyChanged

【讨论】:

    【解决方案2】:

    没有办法做到这一点。最好的选择是将此值包装在您的 ViewModel 中,这样您就可以直接在 ViewModel 上引发 PropertyChanged 事件。

    但是,如果出于某种原因这不是一种选择,另一种选择是调用:

    this.RaisePropertyChanged(string.Empty);
    

    这将刷新视图上的所有绑定,包括MyClass.P1。然而,从性能的角度来看,这并不总是一个很好的解决方案,因为它会强制进行完整的绑定刷新。

    【讨论】:

      【解决方案3】:

      您可以有一个名称遵循此模板的事件:

      public event EventHandler <PropertyName>Changed;
      public event EventHandler P1Changed;
      

      绑定将“自动检测”P1Changed 事件并将其用于数据绑定。

      您需要做的就是在需要时引发P1Changed 事件。

      【讨论】:

        【解决方案4】:

        将 MyClass 类型的属性添加到您的 ViewModel。在你的属性的 setter 中,你可以调用 RaisePropertyChanged()。

        例如,

            public MyClass SomeName
            {
                get
                {
                    return this._SomeName;
                }
                set
                {
                    if (value != this._SomeName)
                    {
                        this._SomeName = value;
                        this.RaisePropertyChanged("SomeName");
                    }
                }
            }
        
            private MyClass _SomeName;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-05
          • 1970-01-01
          • 2013-08-04
          • 2023-03-16
          • 1970-01-01
          • 1970-01-01
          • 2016-09-23
          • 2016-08-07
          相关资源
          最近更新 更多