如何使用虚线路径作为PropertyChangedEventHandler的属性名称?

时间:2015-01-29 04:39:16

标签: c# xaml inotifypropertychanged

如何使用虚线路径作为PropertyChangedEventHandler的属性名称?

public class Person
{
    private int _age;
    public int Age
    {
        get { return _age;}
        set
        {
            _age = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

public partial class MyControl : UserControl, INotifyPropertyChanged
{
    public Person Person
    {
        get { return (Person)GetValue(PersonProperty); }
        set { SetValue(PersonProperty, value); }
    }

    public static DependencyProperty PersonProperty =
        DependencyProperty.Register("Person", typeof (Person), typeof (MyControl), null);

    private void someMethod()
    {
        OnPropertyChanged("Person.Age");
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    }   
}

<TextBox Text="{Binding Person.Age, Mode=TwoWay}"/>

但OnPropertyChanged(&#34; Person.Age&#34;)无法解析符号。

是否可以使用虚线路径作为OnPropertyChanged()的propertyName?

1 个答案:

答案 0 :(得分:2)

Age setter,您应该始终致电OnPropertyChanged("Age")

INotifyPropertyChanged不适用于子属性。您也不需要在UserControl上使用它,因为依赖项属性已经提供了通知。在OnPropertyChanged课程中修复Person来电后,您应该没问题。

您有几个选项可以修复Person.Age setter:

  1. 致电OnPropertyChanged("Age")(并移除= null签名中的OnPropertyChanged

  2. 如果您的目标是.NET 4.5或更高版本,首选解决方案是将Person.OnPropertyChanged签名更改为OnPropertyChanged(string [CallerMemberName] propertyName = null)。然后,从OnPropertyChanged()设置器中调用Age会将propertyName设置为Age。有关详细信息,请参阅this blog postMSDN documentation