WPFのカスタム依存関係プロパティとTwoWayバインディング
-
03-07-2019 - |
質問
DependencyObjectから派生し、DependencyPropertiesを実装するオブジェクトがあります。
基本的には次のようなものです:
class Context : DependencyObject {
public static readonly DependencyProperty NameProperty =
DependencyProperty.Register ("Name", typeof (string), typeof (Context), new PropertyMetadata (""));
public string Name {
get {
return (string)this.GetValue (NameProperty);
}
set {
this.SetValue (NameProperty, value);
}
}
}
これは機能し、プロパティがセットアップされ、バインドできるなどです。TwoWayバインドを使用して、WPFからプロパティにバインドすると問題が発生します。 TwoWayの部分は実際には発生せず、WPFはこのプロパティのセットを呼び出しません。このようにバインドを設定しました:
<TextBox Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
この場合、テキストボックスに入力すると、Nameプロパティがすぐに更新されますが、更新されません。 Nameプロパティを通常のPOCOプロパティに変更すると、機能します(ただし、TwoWayの反対側はINotifyPropertyChangedを実装しない限り明らかに機能しません)。
ここで何が間違っていますか?これは非常に簡単なことですが、頭痛の種は終わりません。
解決
これは予想される動作です。 CLRプロパティは、基になる DependencyProperty
の単なるラッパーです。 WPFは、多くの場合、 GetValue
および SetValue
を直接呼び出して最適化します。実行するカスタムロジックが必要な場合は、 DependencyProperty
のメタデータを使用します。
他のヒント
この問題の後、時間がかかりました:
同じ問題を抱えているが、私のように、上記の答えに解決策が表示されない場合:
DataContextの継承をサポートするには、 DependencyObject ではなく、 FrameworkElement からカスタムクラス(この場合はContext)を派生させる必要があります。それだけです。
マーク