Декларативный синтаксис привязки WPF: включите GroupBox, когда флажок НЕ установлен - PullRequest
2 голосов
/ 07 июля 2011

Я новичок в WPF, поэтому простите меня заранее, если это глупый вопрос. У меня есть синтаксис для включения GroupBox, если флажок установлен, который работает нормально:

IsEnabled="{Binding ElementName=cbIsDeceased, Path=IsChecked}"

Но мне нужно изменить полярность. Мне нужно, чтобы IsEnabled было истинным, когда флажок НЕ установлен, и наоборот. Есть ли декларативный способ получить это?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 07 июля 2011

Вы должны добавить конвертер, чтобы инвертировать логическое значение.В XAML определите ресурс для конвертера и добавьте его в привязку:

IsEnabled="{Binding ElementName=cbIsDeceased, Path=IsChecked, Converter={StaticResource InverseBooleanConverter}"

И чтобы сэкономить время, я дам вам свою версию конвертера, которая чрезвычайно полезна.просто:)

/// <summary>
/// Converts a boolean to its opposite value
/// </summary>
[ValueConversion(typeof(bool), typeof(bool))]
public class InverseBooleanConverter: IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        if (targetType != typeof(bool))
            throw new InvalidOperationException("The target must be a boolean");

        return !(bool)value;
    }

    public object ConvertBack(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }

    #endregion
}
0 голосов
/ 09 июля 2011

Чтобы достичь этого полностью в XAML (то есть без конвертера), вы можете использовать анимации на основе кефрейма, которые запускаются событиями CheckBox Checked и Unchecked.Обратите внимание, что это не Binding, и ничто не «отслеживает» состояние CheckBox, чтобы определить, должен ли GroupBox быть включен.Вот почему (как вы увидите в следующем примере) начальные состояния GroupBox и CheckBox должны быть установлены явно, чтобы анимация работала правильно.

Вот рабочий пример:

<Window ...>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <GroupBox
            x:Name="targetGroupBox"
            Grid.Row="0"
            Header="My GroupBox"
            IsEnabled="False"
            >
            <Button Content="Hello World" />
        </GroupBox>

        <CheckBox
            Grid.Row="1"
            Content="Toggle with animation"
            IsChecked="True"
            >
            <CheckBox.Triggers>
                <EventTrigger RoutedEvent="CheckBox.Checked">
                    <EventTrigger.Actions>
                        <StopStoryboard BeginStoryboardName="SetFalseStoryboard" />
                    </EventTrigger.Actions>
                </EventTrigger>
                <EventTrigger RoutedEvent="CheckBox.Unchecked">
                    <EventTrigger.Actions>
                        <BeginStoryboard Name="SetFalseStoryboard">
                            <Storyboard>
                                <BooleanAnimationUsingKeyFrames
                                    Storyboard.TargetName="targetGroupBox"
                                    Storyboard.TargetProperty="IsEnabled"
                                    AutoReverse="True"
                                    BeginTime="0:0:0"
                                    FillBehavior="HoldEnd"
                                    >
                                    <DiscreteBooleanKeyFrame Value="True" KeyTime="0:0:0" />
                                </BooleanAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger.Actions>
                </EventTrigger>
            </CheckBox.Triggers>
        </CheckBox>
    </Grid>
</Window>

Когда отображается это представление, кнопка внутри родительского GroupBox активна только тогда, когда «анимированный» флажок снят.Поскольку это не привязка, могут быть проблемы с производительностью, которые следует принимать во внимание, то есть преобразователь привязки, который выполняется многократно, может работать лучше, чем анимация на основе ключевых кадров, которая «проигрывается» повторно;Я не проводил никаких тестов производительности для проверки.

В прошлом я использовал подобные анимации редко, так как ненавижу писать и ссылаться на конвертеры для функциональности, которая, по моему мнению, должна быть встроена в WPF внекоробка.Однако в большинстве случаев лучшим выбором является конвертер, этот пример просто показывает, что в некоторых сценариях анимации на основе ключевых кадров можно использовать для достижения желаемого результата полностью в XAML.

...