2011-01-05 24 views
1

私はアナログ時計制御を設計しました。 2つの楕円からのストロークを使用して、時計の面の外側の境界線と内側の境界線を表します。WPFで2つのデータバインド値の合計にバインドするにはどうすればよいですか?

Clock control

私は、ユーザーがこれらの2つの境界の厚さを変えることができるように、ユーザーコントロールのプロパティを公開しています。 Ellipse.StrokeThicknessプロパティは、これらのUserControlプロパティにバインドされます。現時点では、境界線のサイズが大きくなると非表示にならないように、内側の要素の余白に外側の境界線の太さのUserControlプロパティをバインドしています。

<Ellipse Name="OuterBorder" Panel.ZIndex="1" StrokeThickness="{Binding OuterBorderThickness, 
ElementName=This}" Stroke="{StaticResource OuterBorderBrush}" /> 
<Ellipse Name="InnerBorder" Panel.ZIndex="5" StrokeThickness="{Binding InnerBorderThickness, 
ElementName=This}" Margin="{Binding OuterBorderThickness, ElementName=This}" 
Stroke="{StaticResource InnerBorderBrush}"> 
... 
<Ellipse Name="Face" Panel.ZIndex="1" Margin="{Binding OuterBorderThickness, ElementName=This}" 
Fill="{StaticResource FaceBackgroundBrush}" /> 
... 

問題は内側の境界線の太さが増加した場合、これは利益率には影響を与えませんので、時間の目盛りと数字が部分的に隠されたり、隠しなる可能性があることです。私が本当に必要とするのは、内側のコントロールの余白プロパティを内側と外側の境界線の太さの合計(これはdouble型)にバインドできることです。

これを「DataContext = this;」を使用して正常に実行しましたが、これを使わないでコントロールを書き直そうとしていますが、これはお勧めできません。私はまたコンバータを使用して、2番目の値をConverterParameterとして渡すことについて考えましたが、ConverterParameterにバインドする方法を知らなかった。どんなヒントも大歓迎です。

EDIT >>ケントの提案に

おかげで、私は、入力値を追加して、結果を返すために、単純な複数のコンバーを作成しました。私は、TextBlock.TextプロパティとそれをテストするTextBlock.Marginプロパティの両方に、コンバーターXAMLを使ってSAMEマルチバインディングを接続しました。

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding Converter="{StaticResource SumConverter}" ConverterParameter="Add"> 
      <Binding Path="OuterBorderThickness" ElementName="This" /> 
      <Binding Path="InnerBorderThickness" ElementName="This" /> 
     </MultiBinding> 
    </TextBlock.Text> 
    <TextBlock.Margin> 
     <MultiBinding Converter="{StaticResource SumConverter}" ConverterParameter="Add"> 
      <Binding Path="OuterBorderThickness" ElementName="This" /> 
      <Binding Path="InnerBorderThickness" ElementName="This" /> 
     </MultiBinding> 
    </TextBlock.Margin> 
</TextBlock> 

Texblockに正しい値が表示されていますが、余白が設定されていません。何か案は?

EDIT >>

は興味深いことに、Marginプロパティは、double型のデータプロパティにバインドすることができますが、これはMultiBindingの中に適用されていないようです。 Kentさんからアドバイスされているように、私はConverterを値をThicknessオブジェクトとして返すように変更しました。 Kentに感謝します。

答えて

3

表現を評価できるコンバータを使用してMultiBindingを探しているような感じです。私のExpressionConverterはこれを許可します。もちろん、このためにサードパーティのライブラリに依存したくない場合は、2つの値を一緒に追加する独自のマルチバリューコンバータを作成することもできます。

+0

入力値を追加して結果を返す単純なMultiConverterを作成しました。私は、TextBlock.TextプロパティとGrid.Marginプロパティの両方に、コンバーターXAMLを使用してSAMEマルチバインディングをフックしました。私はTexBlockで正しい値を見ることができますが、余白は設定されていません。何か案は? – Sheridan

+0

'Margin'は' Thickness'型ですので、コンバータはそのインスタンスを返さなければなりません。 Visual Studioで出力ウィンドウを確認すると、その旨のメッセージが表示されます。 –

+0

ああ、それは変だけど正しい。興味深いことに、Marginプロパティはdouble型のデータプロパティにバインドできますが、MultiBindingでは適用されません。 – Sheridan

0

これを「DataContext = this;」を使用して正常に実行しましたが、これを使わないでコントロールを書き直そうとしていますが、推奨されていません。

DataContextを変更せずにユーザーコントロールのプロパティにバインドできます。そのルート要素にx:Name属性を追加し、{Binding ElementName=Root, Path=MyProperty}を使用してバインドします。バインダーにコードを挿入するためにコンバーターを使用するよりもはるかに簡単です。

+0

私はすでにこの方法を使用していますが、言及してくれてありがとう。 – Sheridan

+0

(私のルート要素はThisと呼ばれています) – Sheridan

+0

ルート要素を 'This'と呼ぶのは良いアイデアかひどいものです。私はそれについてもう少し考えなければなりません。 –

関連する問題