WPF Generic Windows

PaN*_*1Me 8 generics wpf window

我想制作一个适用于不同类型T 的可重用WPF窗口.我有一个设计器和一个代码隐藏文件.

我可以这样做吗?

/*  Code behind file */
public partial class MyWindows<T> : Window
{}
Run Code Online (Sandbox Code Playgroud)

Mik*_*ail 7

这里无耻地复制(因此没有经过测试)

public class ViewBase<T> : Window, IView where T : class, IViewModel 
{ 
    public virtual T Model 
    { 
        get { return DataContext as T; } 
        set { DataContext = value; } 
    } 
} 
Run Code Online (Sandbox Code Playgroud)

和XAML

<src:ViewBase 
    x:Class="View" 
    x:TypeArguments="src:IViewModel" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:src="clr-namespace:MyNamespace" 
    Height="480" Width="640"> 
... 
</src:ViewBase> 
Run Code Online (Sandbox Code Playgroud)


Eam*_*nne 3

不幸的是,你想要的不太可能

更新:在 .NET 4.0 之前(即最初编写此答案时),对使用泛型类型的 XAML 支持非常有限;例如,泛型仅适用于根元素。在 .NET 4.0 中,一些限制被取消。

在.NET 4.0 中,您可以构造完全专用的泛型类型。因此,虽然 XAML 本身仍然没有泛型类型的概念,但它可以引用泛型类型的特化。(以此类推,XAML不能表达概念List<>,但可以表达概念List<int>)。有关完整详细信息,请参阅MSDN 页面“XAML 中的泛型”

x:TypeArguments您可以使用Directive构造专用泛型类型的实例。例如,x绑定到 XAML 的命名空间,sys绑定到System命名空间,然后scg绑定System.Collections.Generic到您自己的 MyWindows 命名空间my

  • <my:MyWindows x:TypeArguments="x:String">将构造一个MyWindows<string>实例。
  • <scg:List x:TypeArguments="sys:Tuple(sys:String,sys:Int32)">将构造一个List<Tuple<string,int>>

因此,在 XAML 中使用泛型类型不再是问题!

唉,您想在 XAML 中定义泛型类型。那是不可能的。这里有两种解决方法。首先(根据您对另一个问题的评论,我认为这就是您想要的)您可以简单地将类型作为普通参数传递。如果这样做,您将失去泛型提供的所有编译时安全功能,但通常这些功能并不相关。其次,您可以在 XAML 中定义一个带有代码隐藏的普通非泛型类,并简单地使用泛型基类来实现代码重用。这样您至少可以获得一些适当的泛型安全性和重用性。

  • 当您说“例如,XAML 根本不支持泛型”时,您是错误的,它是通过 x:TypeArguments 实现的,请参阅http://blogs.windowsclient.net/rob_relyea/archive/2009/06/01/xaml-在 xaml-2009.aspx 中使用通用类型 (3认同)