【问题标题】:WPF MultiBinding and IMultiValueConverter makes a boolean operationWPF MultiBinding 和 IMultiValueConverter 进行布尔运算
【发布时间】: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”解决了问题。
  • 我会把它添加为答案,所以它可能对其他人有用。

标签: c# boolean operation multibinding imultivalueconverter


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 2011-09-27
    • 2011-03-27
    • 2022-01-01
    • 1970-01-01
    相关资源
    最近更新 更多