如何绑定WPF中两个数据绑定值的总和?

我设计了一个模拟时钟控制。 它使用来自两个椭圆的笔划来表示外部边界和钟面的内部边界。

时钟控制

我在UserControl中公开了允许用户更改这两个边框厚度的属性。 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。 任何提示将非常感谢。

编辑>>

感谢Kent的建议,我创建了一个简单的MultiConverter来添加输入值并返回结果。 我将带有转换器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更改为厚度对象返回值,现在它可以工作。 谢谢肯特。


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


我已经成功地使用'DataContext = this;'来完成这个工作,但是我试图在没有这个的情况下重写控件,因为我听说它不被推荐。

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

链接地址: http://www.djcxy.com/p/67571.html

上一篇: How to bind to the sum of two data bound values in WPF?

下一篇: WPF Binding problems when not setting DataContext