XAML类从泛型扩展,带有泛型类参数

时间:2018-06-06 10:38:57

标签: c# wpf xaml

在我的WPF应用程序中,我希望有一些XAML用户控件,它从具有泛型类参数的基类扩展而来:

XAML:

<base:ModuleView 
x:Class="View.ControllerTestView"
x:TypeArguments="local:ControllerTestModule"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:base="clr-namespace:View"
xmlns:local="clr-namespace:Implementations.Controller.Module">

代码behinde和基类

namespace View
{
    /// <summary>
    /// View Component of the ControllerTestModule
    /// </summary>
    public partial class ControllerTestView: ModuleView<ControllerTestModule>{ //... }

    public abstract class ModuleView<C> : UserControl, IView<C> where C : AbstractController { //.. }

    public class ControllerTestModule : AbstractController{ //... }
}

没有类参数它可以工作,但是使用类参数并添加x:TypeArgument标记我得到Visual Studio显示的以下错误消息:

The name "ModuleView`1" does not exist in the namespace "clr-namespace:View".   
x:TypeArguments="ControllerTestModule" is not valid. 'ControllerTestModule' is not a valid type name reference for the generic argument at position '1'. Line 2 Position 18.    

The name "ControllerTestModule" does not exist in the namespace "clr-namespace:Implementations.Controller.Module". ControllerTestView.xaml

1 个答案:

答案 0 :(得分:2)

基本答案:不要在xaml中这样做。

  1. 它打破了设计师 - 你没有预览
  2. 您不能使用ModuleView&gt;
  3. 等嵌套泛型

    在您的控件的代码后面执行:

    public class TestModuleViewBase : ModuleView<ControllerTestModule>{}
    
    public class TestModuleView : TestModuleViewBase
    {
    
    }
    

    和xaml:

    <TestModuleViewBase 
    x:Class="TestModuleView " <- and some namespaces
    

    这样你就不必与xaml作斗争并且可以使用完整的设计师经验。唯一的缺点是你需要公共基类。