WPF:如何在1个绑定中使用2个转换器?

Nat*_*ium 44 wpf binding converter

我有一个我想显示/隐藏的控件,具体取决于布尔值.

我有一个NegatedBooleanConverter(切换为true,反之亦然),我需要先运行此转换器.我有一个BooleanToVisibilityConverter,我需要在NegatedBoolConverter之后运行这个转换器.

我该如何解决这个问题?我想在XAML中这样做.

编辑:这是一个可能的解决方案.

这似乎不起作用.它首先使用单独的转换器转换值,然后使用转换后的值执行某些操作.

我需要的是:

  • 使用第一个转换器转换值(这将赋予convertedValue).
  • 使用第二个转换器转换convertedValue,这就是我需要的结果.

Nat*_*ium 60

这就是我做的:

public class CombiningConverter : IValueConverter
    {
        public IValueConverter Converter1 { get; set; }
        public IValueConverter Converter2 { get; set; }

        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            object convertedValue = Converter1.Convert(value, targetType, parameter, culture);
            return Converter2.Convert(convertedValue, targetType, parameter, culture);
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
Run Code Online (Sandbox Code Playgroud)

我称之为:

<converters:CombiningConverter x:Key="negatedBoolToVisibilityConverter" Converter1="{StaticResource NegatedBooleanConverter}" Converter2="{StaticResource BoolToVisibilityConverter}" />
Run Code Online (Sandbox Code Playgroud)

我认为也可能是MultiValueConverter.也许我会稍后再试.


Jak*_*ger 28

扩展Natrium的伟大答案......

XAML

<conv:ConverterChain x:Key="convBoolToInverseToVisibility">
    <conv:BoolToInverseConverter />
    <BooleanToVisibilityConverter />
</conv:ConverterChain>
Run Code Online (Sandbox Code Playgroud)

/// <summary>Represents a chain of <see cref="IValueConverter"/>s to be executed in succession.</summary>
[ContentProperty("Converters")]
[ContentWrapper(typeof(ValueConverterCollection))]
public class ConverterChain : IValueConverter
{
    private readonly ValueConverterCollection _converters= new ValueConverterCollection();

    /// <summary>Gets the converters to execute.</summary>
    public ValueConverterCollection Converters
    {
        get { return _converters; }
    }

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Converters
            .Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture));
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Converters
            .Reverse()
            .Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture));
    }

    #endregion
}

/// <summary>Represents a collection of <see cref="IValueConverter"/>s.</summary>
public sealed class ValueConverterCollection : Collection<IValueConverter> { }
Run Code Online (Sandbox Code Playgroud)

  • 这篇文章(http://www.codeproject.com/KB/WPF/PipingValueConverters_WPF.aspx)的解决方案提供了运行时类型检查. (3认同)
  • 这会将错误的targetType传递给转换器。它将目标targetType传递给所有转换器,即使在开头问题的情况下也不正确。当targetType实际上为“ bool”时,“ Visibility”类型将传递给第一个转换器。 (2认同)

met*_*tao 6

在这种情况下,您不需要转换器链。您只需要一个可配置的转换器。这类似于上面 Carlo 的回答,但明确定义了 true 和 false 值(这意味着您可以对HiddenVisibleCollapsed转换使用相同的转换器)。

[ValueConversion(typeof(bool), typeof(Visibility))]
public class BoolToVisibilityConverter : IValueConverter
{
    public Visibility TrueValue { get; set; }
    public Visibility FalseValue { get; set; }

    public BoolToVisibilityConverter()
    {
        // set defaults
        FalseValue = Visibility.Hidden;
        TrueValue = Visibility.Visible;
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (bool)value ? TrueValue : FalseValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在 XAML 中:

<BoolToVisibilityConverter x:Key="BoolToVisibleConverter"
                           FalseValue="Hidden"
                           TrueValue="Visible" />
Run Code Online (Sandbox Code Playgroud)


Nat*_*ium 3

再次回答我自己的问题:我已经使用这个解决方案很多年了:

WPF 中的管道值转换器 - CodeProject

它使用 2 个现有转换器创建一个新转换器,首先调用第一个转换器,然后调用第二个转换器,依此类推。

我对这个解决方案非常满意。