【问题标题】:Converter to Bool转换为布尔值
【发布时间】:2021-06-27 06:52:45
【问题描述】:

我有一个普通的Checkbox,我想将IsChecked 属性设置为Binding 资源。 资源是自写类myClass,可以是null,也可以是引用的(意思是不是null)。

如果分配的对象myObject(在myClass之外)是null,则应检查Checkbox
并检查是否不是null

我必须在xaml 文件的IsChecked="..." 属性中写什么?

【问题讨论】:

    标签: c# wpf xaml checkbox binding


    【解决方案1】:

    您可以使用设置IsChecked 属性的DataTrigger 创建样式。

    <CheckBox>
       <CheckBox.Style>
          <Style TargetType="{x:Type CheckBox}" BasedOn="{StaticResource {x:Type CheckBox}}">
             <Setter Property="IsChecked" Value="True"/>
             <Style.Triggers>
                <DataTrigger Binding="{Binding MyObject}" Value="{x:Null}">
                   <Setter Property="IsChecked" Value="False"/>
                </DataTrigger>
             </Style.Triggers>
          </Style>
       </CheckBox.Style>
    </CheckBox>
    

    另一种方法是创建一个可重用的值转换器。

    public class NotNullToBooleanConverter : IValueConverter
    {
       public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
       {
          return value != null;
       }
    
       public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
       {
          throw new InvalidOperationException();
       }
    }
    

    在任何资源字典中创建转换器的实例,例如应用程序资源。

    <local:NotNullToBooleanConverter x:Key="NotNullToBooleanConverter"/>
    

    这个转换器可以直接在绑定中使用。

    <CheckBox IsChecked="{Binding MyObject, Converter={StaticResource NotNullToBooleanConverter}}"/>
    

    【讨论】:

    • 我个人对 ConvertBack() 方法的偏好是转换器返回 Binding.DoNothing 而不是抛出异常。我发现绑定引擎忽略结果的明确指令让我比一个保证在调用它时不必要地抛出的方法更少焦虑。 :)
    猜你喜欢
    • 2018-01-24
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 2012-02-25
    • 2015-02-20
    • 2013-07-30
    相关资源
    最近更新 更多