我发现UserControl和普通Control之间的属性绑定存在差异。
例如,假设标记包含以下usercontrol:
<myCtrl:DemoControl Level="{Binding Alarm.AlarmLevel}" />
"Level"是在"Control"中创建的int依赖属性。"Alarm"是Inotifypropertychanged类型的对象,字段为AlarmLevel。
public bool AlarmLevel
{
get
{
return this._alarmLevel;
}
set
{
this._alarmLevel = value;
NotifyPropertyChanged("AlarmLevel");
}
}
在usercontrol中,我做了以下操作:
LevelProperty = DependencyProperty.Register("Level", typeof(int), typeof(DemoControl), new UIPropertyMetadata(0, isLevelChanged));
奇怪的是,当给AlarmLevel赋值时,如果值改变,usercontrol属性得到更新。虽然if值保持不变,但没有更新。但是在这两种情况下,"NotifyPropertyChanged"被调用 !
例如AlarmLevel==1,
Alarm.AlarmLevel = 2; // the "isLevelChanged" got called
Alarm.AlarmLevel = 1; // the "isLevelChanged" not called
我记得对于普通控件,每当调用PropertyChanged时,属性就会更新。有人知道为什么吗?很多谢谢!
您的AlarmLevel setter中有一个bug。应该是:
if (_alarmLevel != value)
{
this._alarmLevel = value;
NotifyPropertyChanged("AlarmLevel");
}
你应该只在值实际改变时触发INotifyPropertyChanged。当您使用INotifyPropertyChanged时,变更检查是您的责任。当你设置依赖属性时,WPF框架会为你做检查。
这就是为什么你的代码只工作了一半:).