プロパティを 2 つの依存関係プロパティのいずれかにデータバインドする
-
01-07-2019 - |
質問
ノードに似た 2 つのカスタム コントロールと、ノード間のリンクを描画するコントロールがあります。
両方のコントロールをできるだけ xaml で記述したいと考えています。リンクは両方のノードを依存関係プロパティとして保存し、ノードが移動するたびにデータバインディングを使用してノード間の線を移動します。
2 つのノード間の距離に応じて、線の他の値 (ストローク幅など) を変更できれば素晴らしいでしょう。したがって、どちらかのノードが移動したときにプロパティを更新する必要がありますが、それがどのように機能するのかまったくわかりません。
何かアイデアがある人はいますか?
解決
次のようなことを試してみることができます:
- 前の投稿と同様に、リンククラスの幅、ストローク(必要なもの)プロパティを定義します
- そのプロパティに適用されたマルチバインディングを定義し、2つのノードをバインディングに渡す必要があります。
<マルチバインディング コンバータ="{StaticResource コンバータ}">
<バインディング パス="Node1" RelativeSource|ソース.../>
<バインディング パス="Node2" .../>
</マルチバインディング>
インターフェイス IMultiValueConverter を実装します。これは基本的にノード間の距離に基づいてストロークがどのように見えるかを計算します。
xaml でコンバーターのインスタンスを作成し、それをマルチバインディングの Converter プロパティに追加します。
このソリューションの利点は、非常に明確なクラス モデルがあり、各クラスが単純なタスクを実行できることです。さらに、後から、単純なままでノードを表示するためだけに設計されたノード クラスに触れることなく、追加のケースをサポートするようにコンバータ クラスを構成できます。
一般に、複数のプロパティ値を他の 1 つのプロパティにマップする必要がある場合は、マルチバインディングとコンバーターを使用する必要があります。
他のヒント
ノードが移動するたびに計算されるプロパティ StrokeWidth をリンク クラスで定義し、それに適切なスタイル プロパティをバインドできます。
DataTriggers を使って何かを行うこともできると思いますが、DataTriggers を操作するには特定の値が必要です。いかなる種類の式も使用できません。これにより、ソリューションをノード間のさまざまな距離に適切に拡張することが困難になります。