如何使用虚线路径作为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?
答案 0 :(得分:2)
Age
setter,您应该始终致电OnPropertyChanged("Age")
。
INotifyPropertyChanged
不适用于子属性。您也不需要在UserControl上使用它,因为依赖项属性已经提供了通知。在OnPropertyChanged
课程中修复Person
来电后,您应该没问题。
您有几个选项可以修复Person.Age
setter:
致电OnPropertyChanged("Age")
(并移除= null
签名中的OnPropertyChanged
。
如果您的目标是.NET 4.5或更高版本,首选解决方案是将Person.OnPropertyChanged
签名更改为OnPropertyChanged(string [CallerMemberName] propertyName = null)
。然后,从OnPropertyChanged()
设置器中调用Age
会将propertyName
设置为Age
。有关详细信息,请参阅this blog post或MSDN documentation。