5

私はWPFの初心者ですが、理解できないことがあります。

aが選択されていないCheckBoxときに無効にしたいがあります。RadioButton私の現在の構文は次のとおりです。

<CheckBox IsEnabled="{Binding ElementName=rbBoth, Path=IsChecked}">Show all</CheckBox>

したがって、基本的には、IsEnabledに現在提供しているバインディング式とは反対の値をとらせたいと思います。

これどうやってするの?ありがとう。

4

4 に答える 4

20

値コンバーター(IValueConverterを実装するクラス)と呼ばれるものを使用する必要があります。このようなクラスの非常に基本的な例を以下に示します。(クリッピングに注意してください...)

public class NegateConverter : IValueConverter
{

    public object Convert( object value, Type targetType, object parameter, CultureInfo culture )
    {
        if ( value is bool ) {
            return !(bool)value;
        }
        return value;
    }

    public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture )
    {
        if ( value is bool ) {
            return !(bool)value;
        }
        return value;
    }

}

次に、それをXAMLに含めるには、次のようにします。

<UserControl xmlns:local="clr-namespace:MyNamespace">
    <UserControl.Resources>
        <local:NegateConverter x:Key="negate" />
    </UserControl.Resources>

    ...
    <CheckBox IsEnabled="{Binding IsChecked, ElementName=rbBoth, Converter={StaticResource negate}}"
              Content="Show all" />

</UserControl>
于 2010-06-23T06:46:51.400 に答える
3
<CheckBox>
                    <CheckBox.Style>
                        <Style TargetType="CheckBox">
                            <Setter Property="Visibility" Value="Visible" />
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding IsShowName }" Value="true">
                                    <Setter Property="Visibility" Value="Collapsed" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </CheckBox.Style>
  </CheckBox>
于 2016-08-10T08:17:19.237 に答える
1

現在の構文はすでにニーズに応えています。ラジオボタンがチェックされていない場合、チェックボックスが無効になります。

本当にシナリオを反転させたい場合、必要なのはコンバーターだけです。このサンプルを見てください。

于 2010-06-23T06:48:20.247 に答える
0

これはどう:

ブール値のコンバーターを作成します。

class BooleanValueInverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!(parameter is IValueConverter))
        {
            if (value is bool)
                return !(bool)value;
            else
                return DependencyProperty.UnsetValue;
        }
        else
        {
            IValueConverter converter = (IValueConverter)parameter;
            if (value is bool)
            {
                bool input = !(bool)value;
                return converter.Convert(input, targetType, null, culture);
            }
            else
            {
                return DependencyProperty.UnsetValue;
            }
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

xamlで、インバータークラスが実装されている名前空間をインポートします。

xmlns:util="clr-namespace:MyApp.Utilities"

リソースセクションで、インバータークラスの参照を追加します。

<util:BooleanValueInverter x:Key="Inverter" />

そして、単に次のように使用します。

<TextBox Text="{Binding Path=TextProperty}" IsEnabled="{Binding SomeBoolPropertyToInvert, Converter={StaticResource Inverter}}"/>
于 2015-08-02T12:46:19.103 に答える