如何使用虚线路径作为属性更改事件处理程序的属性名称


如何使用

虚线路径作为 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二传手,你应该总是称OnPropertyChanged("Age")

INotifyPropertyChanged不适用于子媒体资源。在 UserControl 上也不需要它,因为依赖项属性已提供通知。一旦你在Person类中修复了OnPropertyChanged调用,你应该没事。

您有几个选项可以修复Person.Age资源库:

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

  2. 如果面向 .NET 4.5 或更高版本,首选解决方案是将Person.OnPropertyChanged签名更改为 OnPropertyChanged(string [CallerMemberName] propertyName = null) 。然后,从Age二传手调用OnPropertyChanged()将填充集合propertyNameAge。有关更多详细信息,请参阅此博客文章或 MSDN 文档。

相关内容

最新更新