XAML sin el.XAML.código CS detrás de archivos


Estoy usando WPF con el patrón Model-View-ViewModel. Por lo tanto, mi código detrás de los archivos (.XAML.cs) están todos vacíos, excepto para el constructor con una llamada a InitializeComponent. Por lo tanto, para todos .archivo xaml tengo una coincidencia, inútil .XAML.archivo CS.

Juro que leí en alguna parte que si el código detrás del archivo está vacío excepto para el constructor, hay una manera de eliminar el archivo del proyecto por completo. Después de buscar en la red, parece que la forma adecuada de hacerlo es utilizar el atributo '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">

Esto hace lo siguiente en el generado .archivo g. cs:

  1. Elimina el modificador de clase 'parcial' en MyClass.
  2. Añade la clase 'UserControl' a su lista de subclases.

Parece perfecto. De hecho, si todavía tiene el .XAML.archivo cs en la compilación, ya no se compila debido a la falta parcial so así que estoy pensando que esto debe ser correcto. Sin embargo, si elimino el archivo superfluo de la compilación y ejecución, el control lo hace no se inicializa correctamente (está en blanco). Esto es, supongo, porque no se llama a InitializeComponent (). Veo que InitializeComponent no es virtual, por lo que parece que no habría manera de que la clase base lo llamara (sin usar reflexión).

¿Me estoy perdiendo algo?

Gracias!

Eric

Author: Eric, 2009-12-03

5 answers

Si sigues el artículo MVVM de Josh Smith, usa DataTemplates para las vistas en lugar de controles de usuario. Si pones tus DataTemplates en ResourceDictionaries, no tienen un código detrás en absoluto. Si no está utilizando el código detrás de su control de usuario, ¿no significa eso que podría usar un enfoque de DataTemplate? Si lo hace, WPF se encargará de vincular su Vista a su ViewModel por usted.

 13
Author: Scott Whitlock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-05 02:15:01

Como otra opción, si usted no quiere ir todo el camino a usar DataTemplates, aquí es un enfoque alternativo para el UsocOntroles:

Utilice el atributo x:Code para incrustar la llamada al constructor en el XAML:

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

Eric

 32
Author: Eric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-07 17:05:54

Tuve una discusión con un miembro del equipo de cliente de Windows en PDC sobre esto, y en este momento, me dijeron que no hay una forma oficialmente soportada para eliminar por completo el código detrás del archivo. Como puede ver, puede hacer que se compile, pero InitializeComponent() nunca se llama, por lo que el control no se configura correctamente.

El atributo x:Subclass "se usa principalmente para lenguajes que no admiten declaraciones de clases parciales."No se pretendía permitir este comportamiento (desafortunadamente).

 2
Author: Reed Copsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-03 18:09:28

Si está utilizando caliburn micro puede eliminar de manera efectiva .XAML.cs, el framework se encarga de la inicialización (es decir, si va con el enfoque de modelo de vista).

Esto se discute https://caliburnmicro.codeplex.com/discussions/444250

 1
Author: Rohit Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-25 01:48:12

Por pura curiosidad, has intentado usar esto:

x:Subclass="Control"

De forma predeterminada, UserControls requiere la llamada InitializeComponent (), pero los controles defacto-standard no lo hacen. Me interesaría ver si esto funciona.

-Doug

 0
Author: Doug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-03 22:35:26