如何在XAML中指定通用类型参数

7

我是一名有用的助手,可以为您进行文本翻译。

我有一个针对MVP-PRISM WPF应用程序的BaseView。现在由于某些原因,我们考虑将_presenter作为BaseView中的模板字段。

之前,我的视图xaml表示为:

<base:BaseView xamlns:base="clr address of the dll which had BaseView" >

</base:BaseView>

现在我已经将 BaseView 更改为 BaseView<TPresenter>,那么我应该如何编写 Xaml 呢?

2个回答

14

您可以在.NET 4 Framework和XAML 2009中实现此操作。 请参阅MSDN上的XAML中的泛型

例如:

<my:BusinessObject x:TypeArguments="x:String,x:Int32"/>

对于.NET 3.5:

如果针对WPF进行XAML 2006使用,x:Class也必须在与x:TypeArguments相同的元素上提供,并且该元素必须是XAML文档中的根元素。根元素必须映射到至少具有一个类型参数的泛型类型。一个例子是PageFunction。

支持通用用法的可能解决方法包括定义自定义标记扩展,可以返回通用类型,或提供从通用类型派生但在其自己的类定义中平铺通用约束的包装类定义。


你能告诉我在我的场景中,当我想为视图的根节点指定TemplateArgument时,它会是什么样子? - ioWint
我刚刚看到了这篇文章,http://blogs.msdn.com/b/wpfsldesigner/archive/2010/01/22/known-issue-controls-deriving-from-a-generic-base-class-must-be-in-separate-assembly.aspx,它描述了一个已知的问题。我成功地标记了`TypeArgument`以使其正常工作。感谢Sll! - ioWint
3
我该在哪里获取"XAML 2009"?我有 .Net 4.6.2,但我的 WPF 应用程序仍在使用 XAML 2006? - M.kazem Akhgary
@M.kazemAkhgary 这是标准的部分实现,在WPF中已经实现,请阅读相应的MSDN文档。 - sll
@sll 如果可能的话,您能提供一个如何实际使用它的示例吗?在看到这个答案之前,我发布了一个问题。非常感谢任何帮助。 - Dan
@ioWint所评论的工作链接:https://web.archive.org/web/20140422181636/http://blogs.msdn.com/b/wpfsldesigner/archive/2010/01/22/known-issue-controls-deriving-from-a-generic-base-class-must-be-in-separate-assembly.aspx - Dan

1
如果有人遇到类似问题,我也曾经遇到过。我将基类转换为模板类(即BaseView to BaseView),但是在使用InitializeComponent()方法时不断出现错误。在x:Class中基类型的InitializeComponent()调用中,我一直收到空异常错误。通过从XAML定义中删除表单级事件,我能够解决这些错误。如果我必须保留表单级事件,则需要将它们移动到BaseView中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接