【问题标题】:Is there a way to make a two-way MultiBinding only use a converter in a single direction?有没有办法让双向 MultiBinding 只在一个方向上使用转换器?
【发布时间】:2011-03-30 11:37:26
【问题描述】:

我创建了一个自定义多值转换器,以便在多绑定到文本框时执行一些逻辑;但是我不想使用 convertBack,因为绑定值没有编译时类型,并且默认转换可以完美运行。这是可能的还是我必须以某种方式复制内部默认转换器之一的功能?

图表:

values --> Convert() --> TextBox
values <---------------- TextBox

谢谢。

编辑:忘了提到我正在使用 MultiValueConverter 和 MultiBinding,这似乎绕过了默认转换器。

编辑:扩展其背后的原因:我有两个对象 A 和 B(相同类型),我想在 TextBox 中同时编辑它们。在 Convert 方法中,我检查它们是否是相同的值并显示该值或默认值。如果用户更改了 TextBox 中的值,我希望将相同的值发送回 A 和 B。

编辑:我以迂回的方式解决了这个问题 - 请参阅下面的回复。如果您有更好的解决方案,我仍然会很高兴听到它。再次感谢您的时间和帮助。

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    只在convertback中返回值

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return YourLogic(value);
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }
    

    【讨论】:

    • 抱歉忘了提到我正在使用 MultiValueConverter / MultiBinding,当我简单地返回值时,它似乎绕过了“默认”转换器。谢谢。
    【解决方案2】:

    好的,我只是想出了一个解决方案...感谢大家发表建议。

    事实证明,如果您创建一个传递 ValueConverter(如 Convert 和 ConvertBack 的返回值),并将其添加到 MultiBinding 的子绑定中,则默认转换将按预期发生。必须发生的是 MultiBinding 通常会绕过子绑定的 defaultConverter。

    【讨论】:

    • 哇,这很有趣。我从未尝试过每个子绑定上的转换器的行为方式。有时间我一定要试试。
    【解决方案3】:

    不,没有办法绕过转换器。

    正如@ArsenMkrt 解释的那样,您必须通过转换器传递原始值。

    对于 MultiBinding,这很困难,因为您必须能够将 1 值转换为 N。您可能必须在第一次通过时将信息存储在转换器中以帮助您完成此操作。我很少使用双向 MultiBinding,主要是因为很难从单个值转换回多个值。

    这里还有一个缺失的部分。为什么要通过 MultiBinding 传递默认值?这不可能。 MultiBinding 总是需要一个转换器,因为您将多个值合并为一个,然后将一个值扩展为多个。

    【讨论】:

    • 谢谢。我添加了一个编辑来解释我的推理。在我的测试中,我返回了一个 ConvertBack 值数组,但未执行 defaultConversion。
    • 如果您使用StringFormat,则无需转换器
    【解决方案4】:

    这个怎么样:

    MyType Default { get; set; }
    
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // compare values, return value if equal or default
    }
    
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        return Enumerable.Repeat(value, targetTypes.Length).ToArray();
    }
    

    return 函数将值传递回 MultiBinding 的所有源。

    【讨论】:

    • 感谢您的建议,这需要与我的回答结合使用,因为在 MultiConversion 之后不会命中子绑定的默认 ValueConverters。
    【解决方案5】:

    您不能同时利用“默认”转换和自定义值转换器。因此,您需要在自定义值转换器中实现“默认”转换。这样的事情利用了目标类型的默认 TypeConverter:

    public class MyConverter : IMultiValueConverter {
    
        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
            return System.Convert.ToString(values[0]);
        }
    
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) {
            // Get the type of the value, but assume string if it's null
            Type valueType = typeof(string);
            if (value != null)
                valueType = value.GetType();
    
            // Convert value to the various target types using the default TypeConverter
            object[] values = new object[targetTypes.Length];
            for (int i = 0; i < values.Length; i++) {
                TypeConverter typeConverter = TypeDescriptor.GetConverter(targetTypes[i]);
                if (typeConverter != null && typeConverter.CanConvertFrom(valueType))
                    values[i] = typeConverter.ConvertFrom(value);
                else
                    values[i] = value;
            }
            return values;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-28
      • 1970-01-01
      • 2019-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多