PaN*_*1Me 8 generics wpf window
我想制作一个适用于不同类型T 的可重用WPF窗口.我有一个设计器和一个代码隐藏文件.
我可以这样做吗?
/* Code behind file */
public partial class MyWindows<T> : Window
{}
Run Code Online (Sandbox Code Playgroud)
从这里无耻地复制(因此没有经过测试)
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)
不幸的是,你想要的不太可能。
更新:在 .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 中定义一个带有代码隐藏的普通非泛型类,并简单地使用泛型基类来实现代码重用。这样您至少可以获得一些适当的泛型安全性和重用性。