J'ai une question à propos de MVVM en WPF qui est le moteur me batty.
Pourquoi faire quelque chose comme ceci:?
MainWindow.xaml:
<Window x:Class="MVVMProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<ContentControl Content="{Binding}"/>
</Grid>
</Window>
Votre ExampleView.xaml mis en place comme:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vms="clr-namespace:MVVMProject.ViewModels">
<DataTemplate DataType="{x:Type vms:ExampleVM}" >
<Grid>
<ActualContent/>
</Grid>
</DataTemplate>
</ResourceDictionary>
Et de créer la fenêtre comme ceci:
public partial class App : Application {
protected override void OnStartup(StartupEventArgs e) {
base.OnStartup(e);
MainWindow app = new MainWindow();
ExampleVM context = new ExampleVM();
app.DataContext = context;
app.Show();
}
}
Lorsque vous pouvez le faire comme ceci:?
App.xaml: (Set de démarrage de la fenêtre/Afficher)
<Application x:Class="MVVMProject.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="ExampleView.xaml">
</Application>
ExampleView.xaml: (une Fenêtre pas un ResourceDictionary)
<Window x:Class="MVVMProject.ExampleView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vms="clr-namespace:MVVMProject.ViewModels">
>
<Window.DataContext>
<vms:ExampleVM />
</Window.DataContext>
<Grid>
<ActualContent/>
</Grid>
</Window>
Essentiellement, c'est "Vue comme DataTemplate" (VaD) et de "Vue de la Fenêtre" (Vff)
Voici ma compréhension de la comparaison: (Remarque j'utilise VS 2008 donc je manque Blendability et/ou d'autres trucs)
- VaD: vous Permet de changer de Vue sans fermer la fenêtre. (Ce n'est pas souhaitable pour mon projet)
- VaD: VM sait absolument rien sur la Vue, tandis que dans la Violence contre les femmes (seulement) doit être en mesure d'instancier lors de l'ouverture d'une autre fenêtre
- Violence contre les femmes: je peux effectivement voir mon xaml rendus dans le Concepteur (je ne peux pas avec VaD, au moins dans mon installation actuelle)
- Violence contre les femmes: Fonctionne de manière intuitive avec l'ouverture et la fermeture de windows; chaque fenêtre a (est) une Vue correspondante (et ViewModel)
- VaD: ViewModel peut passer le long de la fenêtre initiale de la largeur, la hauteur, la possibilité d'agrandir etc. par le biais des propriétés (alors que dans la Violence contre les femmes, ils sont directement mis dans la Fenêtre)
- Violence contre les femmes: Pouvez définir FocusManager.FocusedElement (pas sûr de la façon de VaD)
- Violence contre les femmes: Moins de fichiers, depuis ma fenêtre types (par exemple, du Ruban, de la boîte de Dialogue) sont incorporés dans leurs points de Vue
Alors que ce passe ici? Je ne peux pas juste de construire mon windows en XAML, d'accéder à leurs données proprement via les propriétés de la VM, et être fait avec elle? Le code-behind est le même (presque nul). J'ai du mal à comprendre pourquoi je devrais lecture aléatoire de toutes la Vue des choses dans un ResourceDictionary. ( Mais je ne veux pas faire de mal ;-) )
Est-il encore de l'importance? Il y a une chose que j'ai manqué? Merci beaucoup pour la lecture. :O
Merci à Rachel Lim et Nick Polyak pour mon épanouissement compréhension de MVVM
Edit: faible flux de changement