代码之家  ›  专栏  ›  技术社区  ›  user4134476

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

  •  1
  • user4134476  · 技术社区  · 10 年前

    如何使用虚线路径作为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()的propertyName?

    1 回复  |  直到 10 年前
        1
  •  2
  •   NextInLine    10 年前

    这个 Age setter,您应该始终调用 OnPropertyChanged("Age") .

    INotifyPropertyChanged 不用于子属性。在UserControl上也不需要它,因为依赖属性已经提供了通知。一旦你修复了 OnPropertyChanged 调用 Person 班上你应该没事。

    您有两个选项来修复 Person.Age 设置器:

    1. 呼叫 OnPropertyChanged(“年龄”) (并删除 = null OnPropertyChanged 签名

    2. 如果目标是.NET 4.5或更高版本,则首选解决方案是更改 Person.OnPropertyChanged 待签名 OnPropertyChanged(string [CallerMemberName] propertyName = null) 使命感 OnPropertyChanged() 来自 年龄 然后setter将填充集合 propertyName 年龄 。请参阅 this blog post MSDN documentation 了解更多详情。