我有简单的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
是什么?
答案 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}
。