Класс XAML, расширяющийся от базы с универсальным параметром класса - PullRequest
0 голосов
/ 06 июня 2018

В моем приложении 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">

Код и базовый класс

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 голосов
/ 06 июня 2018

Основной ответ: не делайте этого в xaml.

  1. Это нарушает конструктор - у вас не будет предварительного просмотра
  2. Вы не можете использовать вложенные дженерики, такие как ModuleView>

в вашем элементе управления в коде позади do:

public class TestModuleViewBase : ModuleView<ControllerTestModule>{}

public class TestModuleView : TestModuleViewBase
{

}

и в xaml:

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

Таким образом, вам не придется бороться с xaml и вы можете использовать полный опыт дизайнера.Единственный недостаток в том, что вам нужен публичный базовый класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...