如何在wpf xaml中使用Value转换器的特定属性

时间:2016-08-16 08:59:14

标签: wpf ivalueconverter

我有一个enum to string converter

public class EnumToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter,
        CultureInfo culture)
    {
        MailSettingsStateEnum enumValue = (MailSettingsStateEnum)value;

        // extension method on the enum, to return a string based on enum.
        return enumValue.Description(); 
    }

    // ConvertBack not relevant here.
}

我在wpf xaml中使用它如下设置标签的Content属性。

<Label Content="{Binding MailSettingState, Converter={StaticResource 
EnumConverterString}}" 
BorderBrush="{Binding MailSettingState, Converter={StaticResource 
EnumConverterBorderBrush}}" />

现在你可以看到,我有另一个属性 BorderBrush 。我还必须基于相同的枚举来设置它。所以我不得不写另一个转换器 EnumConverterBorderBrush

那么有没有一种方法我只有一个转换器,它返回一个具有两个属性的对象,我可以在xaml中使用这些属性?我可以创建转换器,它很容易,但我不知道如何在xaml中使用它。假设转换器返回了一个对象,并且具有名为MessageString(类型为字符串)的两个属性,以及另一个类型为Brush的BorderBrush,如何将其用于xaml?

3 个答案:

答案 0 :(得分:2)

您可以根据转换器中收到的targetType切换输出。

所以你可以这样做:

public class EnumToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter,
        CultureInfo culture)
    {
        var enumValue = (MailSettingsStateEnum)value;

        switch(targetType)
        {
            case typeof(string)
                return enumValue.Description(); 
            case typeof(Brush)
                return enumValue.GetBrush();
            default:
                throw new NotSupportedException("Type not supported")
        }
    }

    // ConvertBack not relevant here.
}

现在你将有一个转换器来统治它们!

答案 1 :(得分:1)

我上面已经评论过,但这是解决方案。

<Label DataContext="{Binding MailSettingState, Converter={converters:EnumConverter}}" Content="{Binding Label}" BorderBrush="{Binding BorderBrush}"/>

public class EnumConverter: MarkupExtension, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var enumValue = (MailSettingsStateEnum) value;
        return new ConvertedEnum { Label = enumValue.Description(), 
                                   BorderBrush = new BorderBrush()};

    }

    // ConvertBack not relevant here.

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
} 

public class ConvertedEnum
{
    public string Label {get; set;}
    public BorderBrush {get; set;}
}

单独的转换器对我来说仍然看起来更漂亮。

答案 2 :(得分:1)

转换器应返回与请求targetType匹配的对象。转换器可以根据enum返回输入parameter值的不同值。我认为它比仅依靠targetType更灵活。

public class SpecEnumConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is Enum)
        {                
            if ((string) parameter == "brush")
                return "Red"; // return brush here!

            // if not pre-defined parameter (null or any other), return description
            return (int) value; // return enum description here!
        }
        return value;
    }

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

用法:

<Label Content="{Binding MailSettingState, Converter={StaticResource 
EnumConverterSpec}}" 
BorderBrush="{Binding MailSettingState, Converter={StaticResource 
EnumConverterSpec}, ConverterParameter='brush'}" />