使用IXamlTypeResolver解析泛型类型

时间:2011-09-29 08:18:38

标签: wpf generics xaml

我编写了一个新的TypeExtension类,它替换了默认的System.Windows.Markup.TypeExtension来处理泛型类型。它允许Xaml以许多不同的方式使用泛型类型,例如:

<DataTemplate DataType="{ck:Type [here a generic type name]}">

这是它的工作原理:

  1. 我写了TypeExtention类,继承了MarkupExtension(它是ck:示例中的Type)
  2. 我重写了ProvideValue方法,在IXamlTypeResolver上调用Resolve

    IXamlTypeResolver service = p.GetService(true);

    _type = service.Resolve(_typeName);

  3. 因此,在.NET 3.5中,我可以解析类似“local:IConfigItemProperty`1”的类型。但现在在.NET 4(使用WPF 4)中,resolve方法抛出异常:

      

    字符'' was unexpected in string 'local:IConfigItemProperty 1'。无效的XA​​ML类型名称。

    你认为.NET 4.0不再支持'''了吗?

1 个答案:

答案 0 :(得分:1)

虽然帖子有点陈旧,但我还是为其他任何寻找解决方案的开发人员提供了答案。 从4.0开始,它们改变了Reader处理泛型的方式。 IXamlTypeResolver服务缺乏对“`”的支持似乎是一个错误,而回归根本没有记录。 如果你想使用泛型,你可能想用x:TypeArguments切换,列出泛型的参数。

<强> C#

public class GraphBase<N,L,P> : IGraph<N,L,P>
{
...
}

<强> XAML

<?xml version="1.0" encoding="utf-8" ?>
<GraphBase
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       xmlns="clr-namespace:MyGeoLive.Topology;assembly=MyGeoLive.Topology"
       xmlns:System="clr-namespace:System;assembly=mscorlib"
       x:TypeArguments="System:String,System:String,System:String" >

</GraphBase>