恕我直言,使用转换器是更好的方法。
您应该做的第一件事是实现一个简单的属性,以便向枚举元素添加一些元数据。这是一个基本示例(为了简单起见,没有国际化):
public enum StepStatus {
[StringValue("Not done yet")]
NotDone,
[StringValue("In progress")]
InProgress,
[StringValue("Failed")]
Failed,
[StringValue("Succeeded")]
Succeeded
}
接下来,您可以编写一个实用程序类,能够使用反射将枚举元素转换为其相应的 StringValue 表示形式。在 Google 中搜索“C# 中的字符串枚举 - CodeProject”,您会找到 CodeProject 关于此的文章(抱歉,我的低声誉不允许我添加链接..)
现在您可以实现一个转换器,将转换简单地委托给实用程序类:
[ValueConversion(typeof(StepStatus), typeof(String))]
public class StepStatusToStringConverter: IValueConverter {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture){
String retVal = String.Empty;
if (value != null && value is StepStatus) {
retVal = StringEnum.GetStringValue((StepStatus)value);
}
return retVal;
}
/// <summary>
/// ConvertBack value from binding back to source object. This isn't supported.
/// </summary>
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture) {
throw new Exception("Can't convert back");
}
}
最后,您可以在 XAML 代码中使用转换器:
<resourceWizardConverters:StepStatusToStringConverter x:Key="stepStatusToStringConverter" />
...
<TextBox Text="{Binding Path=ResourceCreationRequest.ResourceCreationResults.ResourceCreation, Converter={StaticResource stepStatusToStringConverter}}" ... />
检查以下内容page http://www.codeproject.com/KB/WPF/FriendlyEnums.aspx;它给出了一个支持国际化的例子,但基本上原理是一样的。