1. ホーム
  2. wpf

[解決済み】WPFで逆ブーリアンプロパティをバインドする方法は?

2022-04-15 08:56:10

質問

私が持っているオブジェクトは IsReadOnly プロパティがあります。このプロパティが真である場合、私は IsEnabled プロパティを false に設定します。

と同じように簡単にできると信じたい。 IsEnabled="{Binding Path=!IsReadOnly}" が、WPFではそれが通用しない。

スタイル設定をすべて行わなければならないのでしょうか?あるブールを別のブールの逆数に設定するような簡単なことのために、あまりにも言葉が多すぎるように思えます。

<Button.Style>
    <Style TargetType="{x:Type Button}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsReadOnly}" Value="True">
                <Setter Property="IsEnabled" Value="False" />
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=IsReadOnly}" Value="False">
                <Setter Property="IsEnabled" Value="True" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Button.Style>

解決方法は?

boolプロパティを反転してくれるValueConverterを使えばいいんです。

XAMLです。

IsEnabled="{Binding Path=IsReadOnly, Converter={StaticResource InverseBooleanConverter}}"

コンバーターです。

[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
    }