WPF自定义控件与泛型 - 可能吗?

时间:2011-08-11 14:10:21

标签: c# wpf generics xaml controls

我想使用泛型创建自定义WPF控件:

public class MyGenericTypeControl<T> : ItemsControl 
{   
   // ...
}

这可能吗?在我最初的实验中,一旦尝试在某处添加此控件,我就会遇到设计时/编译时XAML错误。这并不奇怪,因为构建我的自定义控件需要XAML不提供的其他信息。

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

XAML不完全支持(还有?),另见this blog post on MSDN

答案 1 :(得分:3)

XAML不支持泛型,您需要创建一个从您的通用控件继承的空非泛型类,并将其与XAML

一起使用

答案 2 :(得分:0)

您只能用另一种方法来实现(从通用基类继承的非通用控件):

public class BaseControl<T> : Control
{
   // base implementation
}


public class MyControl : BaseControl<string>
{
   // ...
}

MyConrtrol的XAML如下所示:

<local:MyControl x:Class="BaseControl"
                 x:TypeArguments="sys:String"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:local="clr-namespace:MyNamespace"
                 xmlns:sys="clr-namespace:System;assembly=System.Runtime">
    ....
<local:MyControl/>

请注意属性x:TypeArguments="....."。如果您的类型参数本身是通用的,则可以使用例如以下:

<local:MyControl x:Class="BaseControl"
                 x:TypeArguments="sys:Tuple(sys:String,sys:Int32)"
                 ...>

代码等同于:

public class MyControl : BaseControl<Tuple<string, int>>
{
   // ...
}