WPF MultiBinding 和 IMultiValueConverter 进行布尔运算

Posted

技术标签:

【中文标题】WPF MultiBinding 和 IMultiValueConverter 进行布尔运算【英文标题】:WPF MultiBinding and IMultiValueConverter makes a boolean operation 【发布时间】:2021-12-06 17:52:44 【问题描述】:

我想用 MultiBinding 和 IMultiValueConverter 创建一个布尔 OR。不幸的是,传递给转换器的值始终未设置。

第一个触发器“TriggerStyle”工作正常。该按钮根据“KeyPlugged”值启用/禁用。

多重触发“EnableTriggerStyle”不起作用。在“BoolTestConverter”类中,值数组很好地设置为 2 个对象,但是

values.Length = 2

values[0]=DependencyProperty.UnsetValue

values[1]=DependencyProperty.UnsetValue

XAML 文件:

<Window.Resources>
    <local:BoolTestConverter x:Key="BoolTestConverter"></local:BoolTestConverter>
    <Style x:Key="TriggerStyle" TargetType="Button">
        <Style.Triggers>
            <DataTrigger Binding="Binding Path=KeyPlugged" Value="false">
                <Setter Property="Button.IsEnabled" Value="False"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
    <Style x:Key="EnableTriggerStyle" TargetType="Button">
        <Style.Triggers>
            <DataTrigger Value="false">
                <DataTrigger.Binding>
                    <MultiBinding Converter="StaticResource BoolTestConverter">
                        <Binding Path="KeyPlugged"/>
                        <Binding Path="KeyOpened"/>
                    </MultiBinding>
                </DataTrigger.Binding>
                <Setter Property="Button.IsEnabled" Value="False"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

C# 文件:

class BoolTestConverter : IMultiValueConverter

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        bool result = false;

        if (values.Length > 1)
        
            if (values[0] == null || values[0] == DependencyProperty.UnsetValue)
                throw new NotImplementedException();

            result = System.Convert.ToBoolean(values[0]);
            for (int i = 1; i < values.Length; i++)
            
                if (values[i] == null || values[i] == DependencyProperty.UnsetValue)
                    throw new NotImplementedException();

                result |= System.Convert.ToBoolean(values[i]);
            
        
        else
            throw new NotImplementedException();

        return result;
    

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    
        throw new NotImplementedException();
    

谢谢。

【问题讨论】:

宁可将NotImplementedException 更改为NotSupportedExceptionNotImplementedException 表示您确实“忘记”了实现它。 你确定MultiValueConverter.Convert 只在两个值都绑定时才被调用吗?我认为不是..它们可能会被顺序绑定。第一次调用 Convert 时,它们可能都未设置。你不应该抛出异常。而是返回return Binding.DoNothing 谢谢。这是正确的。这是我错过的东西。 Convert 的第一次调用未设置“值”,“return Binding.DoNothing”解决了问题。 我会把它添加为答案,所以它可能对其他人有用。 【参考方案1】:

每次设置属性/值时,都会触发多重绑定。第一次触发时,没有任何值被绑定(Unset)。所以转换器会被多次触发。

您不应该抛出异常。而是 return return Binding.DoNothing 否则应用程序将中断。

【讨论】:

以上是关于WPF MultiBinding 和 IMultiValueConverter 进行布尔运算的主要内容,如果未能解决你的问题,请参考以下文章

WPF DataGrid MultiBinding到DataGrid ItemSsource中的类

WPF Multibinding - 需要使用 Relaycommand

是否可以在 WPF 的 MultiBinding QuickConverter 中使用带有参数的经典转换器?

WPF BINDING

WPF 让一组 Button 实现 RadioButton 的当前样式效果

WPF Binding值转换器ValueConverter使用简介-IMultiValueConverter