2016-08-16 83 views
1

有一个枚举字符串转换我如何使用值转换器的特定属性在WPF XAML

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容易如下设置标签的内容属性。

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

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

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

+1

AFAIK这是不可能你问什么。转换器将返回任何你想要的对象,但输出仍然是一个结果。 – lokusking

+1

听起来有点不好意思,但你可以尝试设置'Label'的'DataContext'到转换后的对象(你需要为此创建一个类),然后绑定到它们的属性。不过,我只会使用两个独立的转换器。编辑。测试和工作。 – aQsu

+0

谢谢大家。我刚刚意识到我的愚蠢。我想要的方式,它是不可能的。所有这三个答案都是解决方案,但由于我只能选择一个,所以对另外两个答案表示歉意。 – VivekDev

回答

1

转换器应返回匹配请求的对象targetType。转换器可以根据parameter返回不同的输入值enum值。我认为这比仅依靠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'}" /> 
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

我已经评论过以上,但这里有解决方案。

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

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