非常简化,这是我的问题:(底部的解决方案)
我有一个自定义类,继承 Animatable 和 INotifyPropertyChange,其中包含一个 DependencyProperty(我对其进行动画处理,例如从 1 到 10)和一个额外的属性(我想通过绑定从 XAML 中使用它):
MyClass : Animatable, INotifyPropertyChanged {
public static DependencyProperty AnimateValueProperty = DependencyProperty.Register(
"AnimateValue",
typeof(double),
typeof(MyClass)
);
public double AnimateValue {
get { return (double)GetValue(AnimateValueProperty); }
set {
SetValue(AnimateValueProperty, value);
OnPropertyChanged(new PropertyChangedEventArgs("AnimateValue"));
OnPropertyChanged(new PropertyChangedEventArgs("GuiValue")); //Added in edit
}
}
}
public double GuiValue {
get {
return AnimateValue + 10;
//More fancy stuff happening in the real class...
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) {
if (PropertyChanged != null) {
PropertyChanged(this, e);
}
}
protected override Freezable CreateInstanceCore() {
return new MyClass();
}
}
当我将 GUI 元素绑定到我实际设置动画 (AnimateValue) 的属性时,一切都按预期工作 - 当我将 GUI 元素绑定到相关属性 (GuiValue) 时,什么也没有发生。我猜更改的事件没有到达该属性,但我真的不知道如何解决问题。任何指针?
任何帮助是极大的赞赏!
编辑:感谢 Adam Sills 和 Kai Wang 的两次回复,我愚蠢地忽略了第二次 OnPropertyChange 调用,但是我之前尝试过,但没有成功。为了调试,我在 AnimateValue.set 函数中添加了一条写入行,然后看——它根本没有被执行!
我还尝试将吸气剂更改为始终返回 20 - 没有变化!:-o 动画似乎完全跳过了属性获取和设置,动画并读取了底层的依赖属性......还是我误解了?我使用的动画代码是:
DoubleAnimation da = new DoubleAnimation (1, 10, new Duration(TimeSpan.FromSeconds(3)));
myClassInstance.BeginAnimation(MyClass.AnimateValueProperty, da);
嗯……在这里写完代码之后,不使用 setter 似乎很合理(尽管我真的很希望这样!) - 但是,基本问题仍然存在,我仍然不明白为什么不使用 getter!
编辑2:解决方案!
正如下面所建议的,我不能将 INotifyPropertyChange 用于连接到 DependencyProperty 的属性 - 动画和 XAML 在内部使用 DependencyProperty 并且根本不使用 getter 和 setter。
因此 - PropertyChangedCallback 通知其他人发生变化, CoerceValueCallback 来“修复”数据。也可以验证数据,所有这些都在 DependencyProperty 构造函数中完成。谢谢大家!
谢谢!
/胜利者