2011-01-05 197 views
1

我设计了一个模拟时钟控制。它使用来自两个椭圆的笔划来表示外部边界和钟面的内部边界。如何绑定WPF中两个数据绑定值的总和?

Clock control

我已经暴露在该用户控件允许用户改变这两个边界的厚度特性。 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;'成功完成了这项工作,但是我试图在没有这个的情况下重写控件,因为我听到它不被推荐。我也考虑过使用转换器并将第二个值作为ConverterParameter传递,但不知道如何绑定到ConverterParameter。任何提示将非常感谢。

编辑>>

由于肯特的建议下,我创建了一个简单的多转换器添加的输入值,并返回结果。我将带有转换器XAML的SAME多重绑定连接到TextBlock.Text属性和TextBlock.Margin属性以测试它。

<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中显示的正确值,但未设置边距。有任何想法吗?

编辑>>

有趣的是,Margin属性可以绑定到一个double类型的数据属性,但是这似乎并没有一个MultiBinding内适用。正如Kent所建议的那样,我将Converter更改为厚度对象返回值,现在它可以工作。谢谢肯特。

回答

3

听起来像你正在寻找一个MultiBinding与转换器能够评估一个表达式。我的ExpressionConverter准许这个。当然,如果你不想仅仅依赖第三方库,你可以编写自己的多值转换器,将两个值相加。

+0

我创建了一个简单的MultiConverter来添加输入值并返回结果。我已经将带有转换器XAML的SAME多重绑定连接到TextBlock.Text属性和Grid.Margin属性。我可以在TexBlock中看到正确的值,但未设定保证金。有任何想法吗? – Sheridan 2011-01-05 19:00:23

+0

“边距”属于厚度类型,因此您的转换器将不得不返回该实例。您可以在Visual Studio中检查输出窗口,并且您应该看到一条消息。 – 2011-01-05 20:00:04

+0

啊,这很奇怪......但是正确。有趣的是,Margin属性可以绑定到double类型的数据属性,但这似乎并不适用于MultiBinding。 – Sheridan 2011-01-05 20:45:04

0

我已经成功地使用了'DataContext = this;',但是我试图重写控件而没有这个,因为我听到它不被推荐。

您可以绑定到用户控件的属性而不更改它的DataContext;只需将x:Name属性添加到其根元素,然后使用{Binding ElementName=Root, Path=MyProperty}进行绑定即可。这样做比使用转换器将代码注入绑定更简单。

+0

我已经使用这个方法了,但是谢谢你提到它。 – Sheridan 2011-01-05 19:01:14

+0

(我的根元素被称为这个) – Sheridan 2011-01-05 20:50:56

+0

我不确定是否调用你的根元素'This'是一个好主意或者一个可怕的主意;我需要再考虑一点。 – 2011-01-07 08:08:39