私はアナログ時計制御を設計しました。 2つの楕円からのストロークを使用して、時計の面の外側の境界線と内側の境界線を表します。WPFで2つのデータバインド値の合計にバインドするにはどうすればよいですか?
私は、ユーザーがこれらの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に感謝します。
入力値を追加して結果を返す単純なMultiConverterを作成しました。私は、TextBlock.TextプロパティとGrid.Marginプロパティの両方に、コンバーターXAMLを使用してSAMEマルチバインディングをフックしました。私はTexBlockで正しい値を見ることができますが、余白は設定されていません。何か案は? – Sheridan
'Margin'は' Thickness'型ですので、コンバータはそのインスタンスを返さなければなりません。 Visual Studioで出力ウィンドウを確認すると、その旨のメッセージが表示されます。 –
ああ、それは変だけど正しい。興味深いことに、Marginプロパティはdouble型のデータプロパティにバインドできますが、MultiBindingでは適用されません。 – Sheridan