プロパティを 2 つの依存関係プロパティのいずれかにデータバインドする

StackOverflow https://stackoverflow.com/questions/109275

  •  01-07-2019
  •  | 
  •  

質問

ノードに似た 2 つのカスタム コントロールと、ノード間のリンクを描画するコントロールがあります。

両方のコントロールをできるだけ xaml で記述したいと考えています。リンクは両方のノードを依存関係プロパティとして保存し、ノードが移動するたびにデータバインディングを使用してノード間の線を移動します。

2 つのノード間の距離に応じて、線の他の値 (ストローク幅など) を変更できれば素晴らしいでしょう。したがって、どちらかのノードが移動したときにプロパティを更新する必要がありますが、それがどのように機能するのかまったくわかりません。

何かアイデアがある人はいますか?

役に立ちましたか?

解決

次のようなことを試してみることができます:

  1. 前の投稿と同様に、リンククラスの幅、ストローク(必要なもの)プロパティを定義します
  2. そのプロパティに適用されたマルチバインディングを定義し、2つのノードをバインディングに渡す必要があります。

<マルチバインディング コンバータ="{StaticResource コンバータ}">
<バインディング パス="Node1" RelativeSource|ソース.../>
<バインディング パス="Node2" .../>
</マルチバインディング>

  1. インターフェイス IMultiValueConverter を実装します。これは基本的にノード間の距離に基づいてストロークがどのように見えるかを計算します。

  2. xaml でコンバーターのインスタンスを作成し、それをマルチバインディングの Converter プロパティに追加します。

このソリューションの利点は、非常に明確なクラス モデルがあり、各クラスが単純なタスクを実行できることです。さらに、後から、単純なままでノードを表示するためだけに設計されたノード クラスに触れることなく、追加のケースをサポートするようにコンバータ クラスを構成できます。

一般に、複数のプロパティ値を他の 1 つのプロパティにマップする必要がある場合は、マルチバインディングとコンバーターを使用する必要があります。

他のヒント

ノードが移動するたびに計算されるプロパティ StrokeWidth をリンク クラスで定義し、それに適切なスタイル プロパティをバインドできます。

DataTriggers を使って何かを行うこともできると思いますが、DataTriggers を操作するには特定の値が必要です。いかなる種類の式も使用できません。これにより、ソリューションをノード間のさまざまな距離に適切に拡張することが困難になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top