如何在同一个WPF控件上绑定多个属性?

时间:2012-01-12 16:53:09

标签: .net wpf vb.net xaml data-binding

我能够将我的数据源绑定到显示文本的文本块。但是,如果选中复选框 foo 的值,我想将Fontweight设置为粗体。我正在尝试使用 IMultiValueConverter 来实现这一目标,但到目前为止还没有运气。知道我做错了什么?

<CheckBox Name="foo"/>
<TextBlock Name="bar" Text="{Binding Path=Name}">
    <TextBlock.FontWeight>
        <MultiBinding Converter="{StaticResource FontConverter}">
            <Binding RelativeSource="{RelativeSource self}" Path="???"/>
            <Binding ElementName="???" />
        </MultiBinding>
    </TextBlock.FontWeight>
</TextBlock>

和转换器类(刚刚硬接线总是返回粗体)

Public Class FontConverter
    Implements IMultiValueConverter

    Public Function Convert(values() As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IMultiValueConverter.Convert
        Return "Bold"
    End Function

    Public Function ConvertBack(value As Object, targetTypes() As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object() Implements System.Windows.Data.IMultiValueConverter.ConvertBack
        Return nothing
    End Function
End Class

2 个答案:

答案 0 :(得分:3)

如果你想使用转换器,你应该绑定到CheckBox.IsChecked{Binding IsChecked, ElementName=foo}),你不需要MultiBinding,然后在Convert中投射{{ 1}}到value,并根据它返回普通或粗体(最好是实际的bool,而不是FontWeight)。

然而,我会在string上推荐DataTrigger

e.g。

IsChecked

(另请注意dependency property precedence,如果在本地设置FontWeight,则触发器将不执行任何操作)

答案 1 :(得分:2)

基于XAML条件的任何内容都应该在TriggerDataTrigger中完成。将值从一个值转换为另一个值时,应使用Converters

以下是一个例子:

<CheckBox Name="foo"/>
<TextBlock Name="bar" Text="{Binding Path=Name}">
    <TextBlock.Style>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="FontWeight" Value="Normal" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=foo, Path=IsChecked}" Value="True">
                    <Setter Property="FontWeight" Value="Bold" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>