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

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

25 голосов
/ 03 декабря 2009

Я использую 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 выполняется следующее:

  1. Удаляет «частичный» модификатор класса в MyClass.
  2. Добавляет класс 'UserControl' в свой список подклассов.

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

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

Спасибо!

Эрик

Ответы [ 5 ]

32 голосов
/ 03 декабря 2009

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

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

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

Эрик

13 голосов
/ 05 декабря 2009

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

2 голосов
/ 03 декабря 2009

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

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

1 голос
/ 25 мая 2013

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

Это обсуждается https://caliburnmicro.codeplex.com/discussions/444250

0 голосов
/ 04 декабря 2009

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

x:Subclass="Control"

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

-Doug

...