Wpf XAML设计器错误“;无法强制转换类型为';System.Windows.StaticResourceExtension';输入';System.Windows.Data.IValueConverter'&引用;

Wpf XAML设计器错误“;无法强制转换类型为';System.Windows.StaticResourceExtension';输入';System.Windows.Data.IValueConverter'&引用;,wpf,xaml,markup-extensions,Wpf,Xaml,Markup Extensions,我使用开源XAML标记扩展从声明的enum类型填充,但在设计器中,我收到以下错误(带蓝色斜线的文本): 无法将“System.Windows.StaticResourceExtension”类型的对象强制转换为“System.Windows.Data.IValueConverter”类型 以下是导致错误的XAML(错误位于ItemsSource属性和值上): 以及枚举标记扩展 [ValueConversion(typeof(Enum)、typeof(String))] 公共类EnumToStri

我使用开源XAML标记扩展从声明的
enum
类型填充
,但在设计器中,我收到以下错误(带蓝色斜线的文本):

无法将“System.Windows.StaticResourceExtension”类型的对象强制转换为“System.Windows.Data.IValueConverter”类型

以下是导致错误的XAML(错误位于
ItemsSource
属性和值上):

以及
枚举
标记扩展

[ValueConversion(typeof(Enum)、typeof(String))]
公共类EnumToString转换器:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
...
}
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
...
}
}
[MarkupExtensionReturnType(typeof(IEnumerable))]
公共密封类扩展名:MarkupExtension
{
公共扩展()
{
}
公共枚举扩展(类型、对象转换器)
{
...
//转换器必须是对象,否则WPF会抱怨其他错误
}
}

奇怪的是,当程序运行并且
EnumerateExtension
正确地将枚举的成员(也本地化)加载到组合框中时,这实际上起作用。

将ItemsSource属性值更改为:

ItemsSource="{local:Enumerate Type={x:Type p:FoobarEnum}, Convertor={StaticResource e2s}}"
这将起到110%的作用


问题是,XAML解析器弄不清楚哪一个用于类型,哪一个用于转换器。排序和显式提及在XAML中很重要

将ItemsSource属性值更改为:

ItemsSource="{local:Enumerate Type={x:Type p:FoobarEnum}, Convertor={StaticResource e2s}}"
这将起到110%的作用


问题是,XAML解析器弄不清楚哪一个用于类型,哪一个用于转换器。排序和显式提及在XAML中很重要

执行此操作时,会出现此设计器和生成错误:“分析标记扩展时遇到类型为“MS.Internal.Markup.MarkupExtensionParser+UnknownMarkupExtension”的未知属性“Converter”。“执行此操作时,会出现此设计器和生成错误:“分析标记扩展时遇到类型'MS.Internal.Markup.MarkupExtensionParser+UnknownMarkupExtension'的未知属性'Converter'
[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
    }
}
ItemsSource="{local:Enumerate Type={x:Type p:FoobarEnum}, Convertor={StaticResource e2s}}"