2

私はWPFの初心者なので、これがばかげた質問である場合は、事前にご容赦ください。チェックボックスがオンになっている場合にGroupBoxを有効にするための構文があります。これは正常に機能します。

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

しかし、私が必要としているのは、極性を反転させることです。チェックボックスがチェックされていない場合はIsEnabledをtrueにする必要があり、その逆も同様です。それを取得するための宣言的な方法はありますか?

ありがとう。

4

2 に答える 2

2

ブール値を反転するには、コンバーターを追加する必要があります。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
}
于 2011-07-07T15:42:26.237 に答える
0

これを完全にXAMLで(つまり、コンバーターなしで)実現するために、CheckBoxのCheckedイベントとUncheckedイベントによってトリガーされるkeframeベースのアニメーションを使用できます。これはバインディングではなく、グループボックスを有効にする必要があるかどうかを判断するためにチェックボックスの状態を「監視」するものは何もないことに注意してください。これが、アニメーションが正しく機能するために、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で完全に目的の結果を達成できることを示しています。

于 2011-07-09T18:31:00.500 に答える