我有一个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?
答案 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'}" />