Очень упрощенно, это моя проблема: (решение внизу)
У меня есть собственный класс, наследующий 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), ничего не происходит. Я предполагаю, что измененное событие не достигает этого свойства, но я действительно не знаю, как решить проблему. Есть указатели?
Любая помощь очень ценится!
Edit: Спасибо за два ответа от Adam Sills и Kai Wang, глупо с моей стороны пропустить второй вызов OnPropertyChange, однако я пробовал это раньше, и это не сработало. Для отладки я поместил писатель в функцию AnimateValue.set и вот - она вообще не выполняется!
Я также пытался изменить геттеры, чтобы они всегда возвращали 20 - без изменений! : -o Похоже, что анимация полностью пропускает свойство get, set и анимирует и считывает базовое свойство зависимости ... Или я неправильно понял? Код анимации, который я использую:
DoubleAnimation da = new DoubleAnimation (1, 10, new Duration(TimeSpan.FromSeconds(3)));
myClassInstance.BeginAnimation(MyClass.AnimateValueProperty, da);
Хмм ... После написания этого кода здесь кажется очень разумным, что установщик не используется (хотя мне бы очень хотелось, чтобы это было!) - но все же основная проблема остается, и я до сих пор не понимаю, почему получатель не используется!
Редактировать2: Решение!
Как предлагается ниже, я не мог использовать INotifyPropertyChange для свойств, соединяющихся с DependencyProperty - анимация и XAML внутренне используют DepencencyProperty и вообще не используют методы получения и установки.
Следовательно - PropertyChangedCallback для уведомления других об изменении, CoerceValueCallback для «исправления» данных. Также возможно проверять данные, все это делается в конструкторе DependencyProperty. Спасибо всем!
Спасибо!
/ Victor