【发布时间】: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”解决了问题。
-
我会把它添加为答案,所以它可能对其他人有用。
标签: c# boolean operation multibinding imultivalueconverter