将Enum转换为TextBlock文本中的字符串

时间:2015-12-17 15:03:57

标签: wpf xaml enums

我有简单的Enum

public enum StatusMessage
{
    Cancel,
    Done,
    [Description("In process...")]
    InProcess,
    [Description("We have delay...")]
    Delay,
    Waiting
}

GridViewColumn

我的财产:

StatusMessage StatusMsg;

XAML:

<GridViewColumn Width="180" Header="Status" >
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding StatusMsg}" Foreground="{Binding StatusMsg,Converter={my:StatusMessageToColorConverter}}" />
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

我有EnumToStringConverter

public class EnumToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string EnumString;
        try
        {
            EnumString = Enum.GetName((value.GetType()), value);
            return EnumString;
        }
        catch
        {
            return string.Empty;
        }
    }

    // No need to implement converting back on a one-way binding 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

现在我想在Convertor

中使用此TextBlock
<TextBlock Text="{Binding StatusMsg, Converter={my:EnumToStringConverter}}" Foreground="{Binding StatusMsg,Converter={my:StatusMessageToColorConverter}}" />

所以问题是我有这个错误:

  

'my:EnumToStringConverter'用作标记扩展名,但确实如此   不是从MarkupExtension派生的。

这是MarkupExtension是什么?

1 个答案:

答案 0 :(得分:4)

您需要在XAML中声明EnumToStringConverter的实例。它可以是本地资源,也可以在app.xaml中声明,以便随处访问。

<Window.Resources>
    <my:EnumToStringConverter x:Key="DefaultEnumToStringConverter"/>
</Window.Resources>

然后像这样使用它:

Text="{Binding StatusMsg, Converter={StaticResource DefaultEnumToStringConverter}}"

请注意转换器中的“StaticResource”一词。这是标记扩展。这个告诉WPF使用键“DefaultEnumToStringConverter”找到静态资源。 WPF将搜索元素的可视树,以查找具有该键的资源。如果找不到,则会在app.xaml中的应用程序级别进行检查。

MarkupExtensions是包含在{},“x”,“binding”,“static”等中的属性开头的东西。它们使WPF能够将text属性解析为有用的对象实例。您可以创建自己的MarkupExtensions来做一些很酷的事情。

在您的特定示例中,它正在抱怨,因为它正在寻找一个名为“my”的标记扩展,来自内部Converter={my:EnumToStringConverter}