Как связать несколько свойств в одном элементе управления WPF? - PullRequest
2 голосов
/ 12 января 2012

Я могу связать свой источник данных с текстовым блоком для отображаемого текста. Однако я хотел бы установить Fontweight для полужирного, если установлен флажок foo . Я пытаюсь использовать 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 ]

3 голосов
/ 12 января 2012

Если вы хотите использовать конвертер, вы должны привязать к CheckBox.IsChecked ({Binding IsChecked, ElementName=foo}), вам не нужно MultiBinding, тогда в Convert приведите value к bool и на которые либо возвращают нормальный, либо жирный (предпочтительно как фактический FontWeight, а не string).

Здесь, однако, я бы порекомендовал DataTrigger на IsChecked.

например.

<TextBlock Text="{Binding Name}">
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsChecked, ElementName=foo}"
                             Value="true">
                    <Setter Property="FontWeight" Value="Bold"/>
                </DataTrigger >
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

(Также обратите внимание приоритет свойства зависимости , если вы установите локальный FontWeight, триггер не будет ничего делать)

2 голосов
/ 12 января 2012

Все, что основано на условии в XAML, должно быть выполнено в Trigger или DataTrigger. 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...