Подтвердить что ты не робот

XAML без кода .xaml.cs за файлами

Я использую WPF с шаблоном Model-View-ViewModel. Таким образом, мой код за файлами (.xaml.cs) пуст, кроме конструктора с вызовом InitializeComponent. Таким образом, для каждого .xaml файла у меня есть соответствующий, бесполезный файл .xaml.cs.

Клянусь, я где-то читал, что если код за файлом пуст, кроме конструктора, есть способ полностью удалить файл из проекта. После поиска в сети кажется, что подходящий способ сделать это - использовать атрибут "x: Subclass":

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
    x:Class="MyNamespace.MyClass"
    x:Subclass="UserControl"
    d:DesignWidth="700" d:DesignHeight="500">

В созданном файле .g.cs выполняется следующее:

  • Удаляет модификатор класса "partial" на MyClass.
  • Добавляет класс 'UserControl' в свой список подклассов.

Кажется совершенным. Действительно, если у вас все еще есть файл .xaml.cs в сборке, он больше не компилируется из-за отсутствия частичного, поэтому я думаю, что это должно быть правильно. Однако, если я удалю лишний файл из сборки и запуска, элемент управления не будет инициализирован правильно (он пуст). Это, я полагаю, потому что InitializeComponent() не вызван. Я вижу, что InitializeComponent не является виртуальным, поэтому кажется, что базовый класс не сможет назвать его (не используя отражение).

Я что-то пропустил?

Спасибо!

Эрик

4b9b3361

Ответ 1

Если вы следуете статье Джош Смита MVVM, он использует DataTemplates для представлений, а не пользовательские элементы управления. Если вы поместите свои DataTemplates в ResourceDictionaries, у них вообще нет кода. Если вы не используете код вашего пользовательского элемента управления, разве это не означает, что вы можете использовать подход DataTemplate? Если вы это сделаете, WPF позаботится о том, чтобы привязать ваш View к вашей ViewModel для вас.

Ответ 2

В качестве другого варианта, если вы не хотите полностью использовать DataTemplates, здесь приведен альтернативный подход для UserControls:

Используйте атрибут x: Code для встраивания вызова конструктора в XAML:

<x:Code><![CDATA[ public MyClass() { InitializeComponent(); }]]></x:Code>

Эрик

Ответ 3

У меня была дискуссия с членом команды Windows Client в PDC об этом, и прямо сейчас было сказано, что официально не поддерживается полностью исключить код за файлом. Как вы можете видеть, вы можете получить его для компиляции, но InitializeComponent() никогда не вызывается, поэтому элемент управления не получает правильную настройку.

x: атрибут подкласса "использование в первую очередь предназначено для языков, которые не поддерживают объявления частичного класса". Он не собирался допускать такое поведение (к сожалению).

Ответ 4

Если вы используете caliburn micro, вы можете эффективно удалить .xaml.cs, инфраструктура позаботится об инициализации (т.е. если вы собираетесь использовать подход модели представления).

Об этом говорится https://caliburnmicro.codeplex.com/discussions/444250

Ответ 5

Из чистого любопытства вы пробовали использовать это:

x:Subclass="Control"

По умолчанию для UserControls требуется вызов InitializeComponent(), но нет стандартных элементов управления defacto. Мне было бы интересно узнать, работает ли это.

-Doug