XAML sans le.XAML.code cs derrière les fichiers

J'utilise WPF avec le modèle Model-View-ViewModel. Ainsi, mon code derrière les fichiers (.XAML.cs) sont tous vides, sauf pour le constructeur avec un appel à InitializeComponent. Ainsi, pour chaque .fichier xaml j'ai une correspondance, inutile,.XAML.cs fichier.

Je jure avoir lu quelque part que si le code derrière le fichier est vide à l'exception du constructeur, il existe un moyen de supprimer complètement le fichier du projet. Après recherche sur le net, il semble que la façon appropriée de le faire est d'utiliser l'attribut 'x: sous-classe':

<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">

Cela fait ce qui suit dans le généré .G. fichier cs:

  1. supprime le modificateur de classe' partial ' sur MyClass.
  2. ajoute la classe 'UserControl' à sa liste de sous-classes.

Semble parfait. En effet, si vous avez encore la .XAML.fichier cs dans la construction, il ne compile plus à cause du partiel manquant-donc je pense que cela doit être correct. Cependant, si je supprime le fichier superflu de la construction et de l'exécution, le contrôle le fait obtenez pas initialisé correctement (il est vide). C'est, je suppose, parce que InitializeComponent() n'est pas appelé. Je vois que InitializeComponent n'est pas virtuel, il semble donc qu'il n'y aurait aucun moyen pour la classe de base de l'appeler (à moins d'utiliser la réflexion).

Est-ce que je manque quelque chose?

Merci!

Eric

25
demandé sur Eric 2009-12-03 20:46:31

5 réponses

Si vous suivez L'article MVVM de Josh Smith , Il utilise DataTemplates pour les vues plutôt que les contrôles utilisateur. Si vous mettez vos DataTemplates dans ResourceDictionaries, ils n'ont pas de code-behind du tout. Si vous n'utilisez pas le code derrière votre contrôle utilisateur, cela ne signifie-t-il pas que vous pouvez utiliser une approche DataTemplate? Si vous faites cela, WPF prendra soin de lier votre vue à votre ViewModel pour vous.

13
répondu Scott Whitlock 2009-12-05 02:15:01

Comme une autre option, si vous ne voulez pas aller jusqu'à utiliser DataTemplates, voici une approche alternative pour UserControls:

Utilisez l'attribut x:Code pour intégrer l'appel du constructeur dans XAML:

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

Eric

32
répondu Eric 2009-12-07 17:05:54

J'ai eu une discussion avec un membre de L'équipe Client Windows à PDC à ce sujet, et en ce moment, on m'a dit qu'il n'y a pas de moyen officiellement pris en charge pour éliminer complètement le code derrière le fichier. Comme vous pouvez le voir, vous pouvez le faire compiler, mais InitializeComponent() n'est jamais appelé, donc le contrôle n'est pas configuré correctement.

L'utilisation de l'attribut x:Subclass "est principalement destinée aux langages qui ne prennent pas en charge les déclarations de classe partielles."Il n'était pas destiné à permettre ce comportement (malheureusement).

2
répondu Reed Copsey 2009-12-03 18:09:28

Si vous utilisez caliburn micro, vous pouvez supprimer efficacement .XAML.cs, le framework prend en charge l'initialisation (c'est-à-dire si vous allez avec l'approche view-model).

Ceci est discuté https://caliburnmicro.codeplex.com/discussions/444250

1
répondu Rohit Sharma 2013-05-25 01:48:12

, par pure curiosité, avez-vous essayé ceci:

x:Subclass="Control"

Par défaut, UserControls nécessite L'appel InitializeComponent (), mais pas les contrôles standard de facto. Je serais intéressé de voir si cela fonctionne.

-Doug

0
répondu Doug 2009-12-03 22:35:26