我有一个简单的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"的标记扩展。