我使用MultiBinding作为引用创建了一个内联this post。更具体地说,我使用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,就像“不和谐”的例子一样(同时将类缩减为只有一个带有两个参数的构造函数),但这也是行不通的。这就产生了这个错误:
解析标记扩展时遇到的'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被设置为MultiBoolConverter。所以,我不知道为什么它仍然给设计师错误。
解决办法:
这个问题是非常非常愚蠢的。在将解决方案从VS2008迁移到VS2015之后,XAML设计人员给了我一个错误或什么,并建议禁用代码执行,所以我做到了。因此,使用内联多绑定器会使它很混乱,因为转换器没有被传递进来。我很难找到在哪里重新启动代码执行,但一旦找到了,它就起作用了。因此,内联多绑定可以工作--如果它正在执行。
如果你遇到同样的问题,下面这个按钮让我无法理解:

发布于 2016-05-06 07:22:18
首先,您的MultiBinder 执行工作,因为您在问题中提供了它,没有做任何修改。它不会在运行时产生任何错误,并调用正确的构造函数。
问题是WPF设计器,这是众所周知的相当错误和产生错误在许多情况下,如这一个。当然,您可以忽略您在设计中看到的“错误”,但这是相当恼人的,而且如果您忽略它们,您可能会错过真正的错误。
相反,我们可以找到确切的设计师做错了什么,并试图修复这一点。错误消息提供了一个线索,即在设计模式下传递给构造函数的转换器是空的。然后我们就可以这样解决它:
public class MultiBinder : MultiBinding {
public MultiBinder(BindingBase b1, BindingBase b2, object converter = null) {
Bindings.Add(b1);
Bindings.Add(b2);
Converter = converter as IMultiValueConverter;
CheckConverter();
}
public MultiBinder(BindingBase b1, BindingBase b2, BindingBase b3, object converter) {
Bindings.Add(b1);
Bindings.Add(b2);
Bindings.Add(b3);
Converter = converter as IMultiValueConverter;
CheckConverter();
}
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;
CheckConverter();
}
private void CheckConverter() {
if (Converter == null && DesignerProperties.GetIsInDesignMode(new DependencyObject())) {
// if we are in design mode - feed dummy converter which cannot be called to wpf designer
Converter = new DummyConverter();
}
}
private class DummyConverter : IMultiValueConverter {
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) {
throw new NotSupportedException();
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) {
throw new NotSupportedException();
}
}
}此活页夹既不会产生设计错误,也不会在运行时产生错误。
发布于 2016-05-05 18:41:17
请参考下面的代码。
<MyControl.IsEnabled>
<util:MultiBinder Convertor="{StaticResource MultiBoolConverter}" >
<Binding Path ="IsRequestedPriceControlEnabled"/>
<Binding Path ="IsIndicative"/>
</util:MultiBinder>
</MyControl.IsEnabled> https://stackoverflow.com/questions/37057720
复制相似问题