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

How can I use a dotted path as a property name of a PropertyChangedEventHandler?

如何使用虚线路径作为 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("Person.Age") 无法解析符号。

是否可以使用虚线路径作为 属性OnPropertyChanged() 的名称?

Age setter,你应该总是调用OnPropertyChanged("Age")

INotifyPropertyChanged 不适用于子属性。您也不需要在 UserControl 上使用它,因为依赖属性已经提供了通知。一旦你在 Person class 中修复你的 OnPropertyChanged 调用,你应该没问题。

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

  1. 调用OnPropertyChanged("Age")(并删除OnPropertyChanged签名中的= null

  2. 如果您的目标是 .NET 4.5 或更高版本,首选解决方案是将 Person.OnPropertyChanged 签名更改为 OnPropertyChanged(string [CallerMemberName] propertyName = null)。从 Age setter 调用 OnPropertyChanged() 将填充集合 propertyNameAge。有关详细信息,请参阅 this blog post or the MSDN documentation