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



我有一个简单的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();
    }
}

现在我想在我的TextBlock:中使用这个Convertor

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

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

"my:EnumToStringConverter"的使用类似于标记扩展,但确实不是从MarkupExtension派生的。

这个MarkupExtension是什么?

您需要在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能够将文本属性解析为有用的对象实例。您可以创建自己的MarkupExtensions来做一些非常酷的事情。

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

最新更新