gpt4 book ai didi

c# - 内联 MultiBinding 未按预期工作

转载 作者:太空宇宙 更新时间:2023-11-03 17:00:26 37 4
gpt4 key购买 nike

我创建了一个内联 MultiBinding使用 this post作为引用。更具体地说,我正在使用 Christian Myksvoll 的答案来创建自定义绑定(bind)。我的类(class)看起来像这样:

   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;
}
}

我添加了第一个数组构造函数只是为了看看我是否可以让它处理未知数量的绑定(bind),但我无法调用它。所以,我删除了它,现在我正在尝试使用 3 值构造函数:

<MyControl IsEnabled="{util:MultiBinder 
{Binding Path=IsRequestedPriceControlEnabled},
{Binding Path=IsIndicative},
{StaticResource MultiBoolConverter}
}" />

它给我这个错误:

Cannot set MultiBinding because MultiValueConverter must be specified.

我提供的转换器实现了 IMultiValueConverter并且在其他地方的样式 block 中使用没有问题。由于需要大量的控件类型和可变条件,我不能为此在样式 block 中使用它。

类声明:public class MultiBoolToBoolConverter : IMultiValueConverter
资源:<util:MultiBoolToBoolConverter x:Key="MultiBoolConverter" />

我唯一能想到的是它无法识别第三个参数是转换器。我试过修补 IsEnabled明确设置 Converter 的内容就像 Discord 的示例(同时将类缩减为只有一个带有 2 个参数的构造函数),但这也不起作用。这给出了这个错误:

Unknown property 'Converter' for type 'MS.Internal.Markup.MarkupExtensionParser+UnknownMarkupExtension' encountered while parsing a Markup Extension.

我的问题:

有没有人做过这样的内联多重绑定(bind)并且知道我做错了什么?

注意:我使用的是 .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 使它感到困惑,因为没有传入转换器。我很难找到在哪里重新打开代码执行,但是一旦找到,它就起作用了。因此,内联多重绑定(bind)确实有效——如果它正在被执行。

如果您遇到同样的问题,这是我没有找到的按钮:

Enable Project Code

最佳答案

首先,您的 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();
}
}
}

此绑定(bind)器在设计器和运行时都不会产生错误。

关于c# - 内联 MultiBinding 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37057720/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com