非常に単純化されていますが、これが私の問題です:(下部の解決策)
AnimatableとINotifyPropertyChangeを継承するカスタムクラスがあり、1つのDependencyProperty(たとえば、1から10までアニメーション化)と1つの追加プロパティ(バインディングを使用して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)にバインドすると、何も起こりません。変更されたイベントはそのプロパティに到達しないと思いますが、問題を解決する方法が本当にわかりません。ポインタはありますか?
どんな助けでも大歓迎です!
編集:AdamSillsとKaiWangからの2つの返信に感謝します。2回目のOnPropertyChange呼び出しを省略してくれたのは愚かでしたが、以前に試したのですが、うまくいきませんでした。デバッグするために、私はAnimateValue.set関数に書き込み行を入れて、見よ、それはまったく実行されません!
また、ゲッターを変更して、常に20を返すようにしました。変更はありません。:-oアニメーションはプロパティgetとsetを完全にスキップし、アニメーション化して基になる依存関係プロパティを読み取るようです...または私は誤解しましたか?私が使用するアニメーションコードは次のとおりです。
DoubleAnimation da = new DoubleAnimation (1, 10, new Duration(TimeSpan.FromSeconds(3)));
myClassInstance.BeginAnimation(MyClass.AnimateValueProperty, da);
うーん...ここにそのコードを書いた後、セッターが使用されていないことは非常に合理的です(私は本当にそれを望んでいますが!)-それでも、基本的な問題は残っており、ゲッターが使用されない理由がわかりません!
Edit2:解決策!
以下に示すように、DependencyPropertyに接続するプロパティにINotifyPropertyChangeを使用できませんでした。アニメーションとXAMLは内部でDepencencyPropertyを使用し、ゲッターとセッターをまったく使用しません。
したがって、-PropertyChangedCallbackは変更を他の人に通知し、CoerceValueCallbackはデータを「修正」します。データを検証することも可能です。これはすべて、DependencyPropertyコンストラクターで行われます。皆さんありがとう!
ありがとう!
/ビクター