XAML设计器错误“无法将类型为'System.Windows.StaticResourceExtension'的对象强制转换为'System.Windows.Data.IValueConverter'。”

时间:2015-10-06 04:44:54

标签: wpf xaml markup-extensions

我正在使用开源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中时,这实际上是有效的。

1 个答案:

答案 0 :(得分:0)

将ItemsSource属性值更改为:

ItemsSource="{local:Enumerate Type={x:Type p:FoobarEnum}, Convertor={StaticResource e2s}}"

这将有效率为110%。

问题是XAML解析器很难弄清楚哪一个用于Type,哪一个用于Convertor。在XAML中,排序和明确提及很重要。