首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内联MultiBinding未按预期工作

内联MultiBinding未按预期工作
EN

Stack Overflow用户
提问于 2016-05-05 18:27:48
回答 2查看 1.5K关注 0票数 2

我使用MultiBinding作为引用创建了一个内联this post。更具体地说,我使用Christian Myksvoll的答案来创建自定义绑定。我的课是这样的:

代码语言:javascript
复制
   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值构造函数:

代码语言:javascript
复制
<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并使用虚拟转换器的情况下,设计器中也会出现错误。但是,它确实会运行。我正在用这个测试它:

代码语言:javascript
复制
CommandParameter="{util:MultiBinder {Binding Path=IsExpiriesComboBoxEnabled}, {Binding Path=IsIndicative}, {StaticResource MultiBoolConverter}}"

如果我在MultiBinder中放置了一个断点,它将正确地进入3个参数重载(b1、b2、转换器),并且我可以看到Converter被设置为MultiBoolConverter。所以,我不知道为什么它仍然给设计师错误。

解决办法:

这个问题是非常非常愚蠢的。在将解决方案从VS2008迁移到VS2015之后,XAML设计人员给了我一个错误或什么,并建议禁用代码执行,所以我做到了。因此,使用内联多绑定器会使它很混乱,因为转换器没有被传递进来。我很难找到在哪里重新启动代码执行,但一旦找到了,它就起作用了。因此,内联多绑定可以工作--如果它正在执行。

如果你遇到同样的问题,下面这个按钮让我无法理解:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-06 07:22:18

首先,您的MultiBinder 执行工作,因为您在问题中提供了它,没有做任何修改。它不会在运行时产生任何错误,并调用正确的构造函数。

问题是WPF设计器,这是众所周知的相当错误和产生错误在许多情况下,如这一个。当然,您可以忽略您在设计中看到的“错误”,但这是相当恼人的,而且如果您忽略它们,您可能会错过真正的错误。

相反,我们可以找到确切的设计师做错了什么,并试图修复这一点。错误消息提供了一个线索,即在设计模式下传递给构造函数的转换器是空的。然后我们就可以这样解决它:

代码语言:javascript
复制
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();
        }
    }
}

此活页夹既不会产生设计错误,也不会在运行时产生错误。

票数 1
EN

Stack Overflow用户

发布于 2016-05-05 18:41:17

请参考下面的代码。

代码语言:javascript
复制
<MyControl.IsEnabled>
      <util:MultiBinder Convertor="{StaticResource MultiBoolConverter}" >
          <Binding Path ="IsRequestedPriceControlEnabled"/> 
          <Binding Path ="IsIndicative"/> 
     </util:MultiBinder>
  </MyControl.IsEnabled>   
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37057720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档