【发布时间】:2026-01-09 15:25:11
【问题描述】:
我使用this post 作为参考创建了一个内联MultiBinding。更具体地说,我正在使用 Christian Myksvoll 的答案来创建自定义绑定。我的班级是这样的:
public class MultiBinder : MultiBinding
{
public MultiBinder(BindingBase[] bindings, object converter)
{
foreach (BindingBase b in bindings)
{
Bindings.Add(b);
}
Converter = converter as IMultiValueConverter;
}
public MultiBinder(BindingBase b1, BindingBase b2, object converter)
{
Bindings.Add(b1);
Bindings.Add(b2);
Converter = converter as IMultiValueConverter;
}
public MultiBinder(BindingBase b1, BindingBase b2, BindingBase b3, object converter)
{
Bindings.Add(b1);
Bindings.Add(b2);
Bindings.Add(b3);
Converter = converter as IMultiValueConverter;
}
public MultiBinder(BindingBase b1, BindingBase b2, BindingBase b3, BindingBase b4, object converter)
{
Bindings.Add(b1);
Bindings.Add(b2);
Bindings.Add(b3);
Bindings.Add(b4);
Converter = converter as IMultiValueConverter;
}
}
我添加了第一个数组构造函数只是为了看看我是否可以让它处理未知数量的绑定,但我无法让调用工作。所以,我删除了它,现在我尝试使用 3 值构造函数:
<MyControl IsEnabled="{util:MultiBinder
{Binding Path=IsRequestedPriceControlEnabled},
{Binding Path=IsIndicative},
{StaticResource MultiBoolConverter}
}" />
它给了我这个错误:
无法设置 MultiBinding,因为必须指定 MultiValueConverter。
我提供的转换器实现了IMultiValueConverter,并且在其他地方的样式块中使用没有问题。由于需要大量的控件类型和变量条件,我不能在样式块中使用它。
类声明:public class MultiBoolToBoolConverter : IMultiValueConverter
资源:<util:MultiBoolToBoolConverter x:Key="MultiBoolConverter" />
我唯一能想到的是它无法识别第三个参数是转换器。我尝试修改IsEnabled 内容以显式设置Converter,就像Discord 的示例一样(同时将类缩减为只有一个带有2 个参数的构造函数),但这也不起作用。这给出了这个错误:
解析标记扩展时遇到类型“MS.Internal.Markup.MarkupExtensionParser+UnknownMarkupExtension”的未知属性“转换器”。
我的问题:
有没有人做过这样的内联多重绑定并且知道我做错了什么?
注意:我使用的是 .NET 4.6,因此如果需要,我可以使用任何其他功能。
编辑:
即使 Evk 默认为 null 并使用虚拟转换器,我仍然在设计器中收到上述“无法设置 [...]”错误。但是,它确实运行。我正在用这个测试它:
CommandParameter="{util:MultiBinder {Binding Path=IsExpiriesComboBoxEnabled}, {Binding Path=IsIndicative}, {StaticResource MultiBoolConverter}}"
如果我在 MultiBinder 中设置断点,它会正确进入 3 参数重载 (b1,b2,converter),我可以看到 Converter 被设置为 MultiBoolConverter。所以,我不知道为什么它仍然给设计者错误。
解决方案:
问题是一个非常非常愚蠢的问题。在将解决方案从 VS2008 迁移到 VS2015 后的某个时刻,XAML 设计人员给了我一个错误或其他东西,并建议禁用代码执行,所以我做了。因此,使用内联 multibinder 会让人感到困惑,因为没有传入转换器。我很难找到在哪里重新打开代码执行,但是一旦我这样做了,它就起作用了。因此,内联多重绑定 DOES 工作——如果它正在执行。
如果你遇到同样的问题,这里是我没有找到的按钮:
【问题讨论】: