簡體   English   中英

WPF MultiBinding 和 IMultiValueConverter 進行布爾運算

[英]WPF MultiBinding and IMultiValueConverter makes a boolean operation

我想用 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();
    }
}

謝謝你。

每次設置屬性/值時,都會觸發多重綁定。 第一次觸發時,沒有任何值被綁定(Unset) 所以轉換器被多次觸發。

你不應該拋出異常。 而是返回 return Binding.DoNothing 否則應用程序將中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM