我正在使用开源XAML标记扩展来从声明的<ComboBox>
类型填充enum
,但在设计器中我得到这些错误(蓝色波浪线加下划线的文本):
无法将类型为“System.Windows.StaticResourceExtension”的对象强制转换为“System.Windows.Data.IValueConverter”。
以下是导致错误的XAML(错误在ItemsSource
属性和值上):
<ComboBox
ItemsSource="{local:Enumerate {x:Type p:FoobarEnum}, {StaticResource e2s}}"
SelectedItem="{Binding Foobar, Converter={StaticResource e2s}}"
/>
e2s
资源在ResourceDictionary中声明:
<v:EnumToStringConverter x:Key="e2s" />
Enumerate
标记扩展程序is from this GitHub project。
[ValueConversion( typeof( Enum ), typeof( String ) )]
public class EnumToStringConverter : IValueConverter
{
public Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture)
{
...
}
public Object ConvertBack(Object value, Type targetType, Object parameter, CultureInfo culture)
{
...
}
}
[MarkupExtensionReturnType( typeof( IEnumerable<Object> ) )]
public sealed class EnumerateExtension : MarkupExtension
{
public EnumerateExtension()
{
}
public EnumerateExtension(Type type, Object converter)
{
...
// converter needs to be Object otherwise WPF complains with other errors
}
}
奇怪的是,当程序运行并且EnumerateExtension
正确地将枚举成员(也已本地化)加载到ComboBox中时,这实际上是有效的。
答案 0 :(得分:0)
将ItemsSource属性值更改为:
ItemsSource="{local:Enumerate Type={x:Type p:FoobarEnum}, Convertor={StaticResource e2s}}"
这将有效率为110%。
问题是XAML解析器很难弄清楚哪一个用于Type,哪一个用于Convertor。在XAML中,排序和明确提及很重要。