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
更改为NotSupportedException
。 NotImplementedException
表示您确实“忘记”了实现它。
你确定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 中使用带有参数的经典转换器?