如何为数据绑定启用属性更改?

时间:2011-09-20 15:46:58

标签: c# silverlight mvvm

假设我有实现了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”)的内容?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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

this.RaisePropertyChanged(string.Empty);

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

答案 2 :(得分:0)

您可以在此模板后面有一个名称的事件:

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

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

您需要做的就是在需要时举起P1Changed事件。

答案 3 :(得分:0)

将一个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;