La signification réelle de MVVM est: UI n'est pas une donnée. Les données sont des Données, l'INTERFACE utilisateur de l'INTERFACE utilisateur.
Cela signifie que vous ne devrait pas développer l'application de sorte que la logique du programme (souvent appelé " business logic) est étroitement couplée ou dépendant de l'état des composants de l'INTERFACE utilisateur, mais au lieu de le rendre dépendant de l'état des éléments de données (que ce soit le Modèle ou le Modèle de Vue).
Par exemple, dans d'autres cadres (tels que les winforms), si vous avez un écran qui contient une zone de texte et un bouton, vous l'habitude d'ajouter un gestionnaire d'événements click pour le bouton, puis de lire le texte de la zone de texte. dans MVVM, la propriété Text de la zone de texte doit être lié à une propriété de type chaîne dans le ViewModel, et le bouton doit être lié à une Commande dans le ViewModel ainsi.
Cela permet une abstraction de l'INTERFACE utilisateur (qui est le ViewModel), de sorte que, comme je l'ai dit avant, la logique de l'application peuvent être dépend pas de l'INTERFACE utilisateur, mais une abstraction d'elle.
Cela permet une énorme quantité d'évolutivité dans l'INTERFACE utilisateur et la logique, et permet également la testabilité de plusieurs aspects de l'INTERFACE utilisateur, le comportement parce qu'une grande partie de l'INTERFACE, le comportement est défini dans le ViewModel.
Il y a d'autres aspects de MVVM, mais la principale réalisation est que.
Edit:
Je vais ajouter un exemple concret de ce pour l'intégralité de la réponse:
1 - Non WPF MVVM:
XAML:
<StackPanel>
<TextBox x:Name="txtLastName"/>
<Button Content="Click Me" Click="Button_Click"/>
</StackPanel>
Code derrière:
private void Button_Click(object sender, EventArgs e)
{
var lastname = this.txtLastName.Text; //Assuming this is the code behind the window that contains the above XAML.
//Here you do some actions with the data obtained from the textbox
}
2 - WPF MVVM:
XAML:
<StackPanel>
<StackPanel.DataContext>
<my:MyViewModel/>
</StackPanel.DataContext>
<TextBox Text="{Binding LastName}"/>
<Button Content="Click Me" Command="{Binding MyCommand}"/>
</StackPanel>
ViewModel:
public class MyViewModel
{
public string LastName {get;set;}
public Command MyCommand {get;set;}
public MyViewModel()
{
MyCommand = new Command(ExecuteMyCommand); // The command recieves an action on the constructor, which is the action to execute when the command is invoked.
}
private void ExecuteMyCommand()
{
var lastname = this.LastName; //Only for illustration purposes, not really needed.
//Here you do some actions with the data obtained from the textbox
}
}
Comme vous pouvez le voir dans l'exemple ci-dessus, le ViewModel ne contient aucune référence à la Vue. Ainsi, le point de Vue pourrait être n'importe quoi, tant que l' {Bindings}
sont restées en place.
La colle qui comme par magie les fait travailler ensemble, c'est l' DataContext
de la Propriété de WPF Éléments de l'INTERFACE utilisateur, qui est l'objet de toutes les liaisons seront résolus.
Il y a d'autres choses, telles que la Notification de Modification de Propriété du ViewModel pour permettre des liaisons bidirectionnelles, mais qui est hors de la portée de cette réponse.
Aussi garder à l'esprit que MVVM est un modèle de conception, alors que WPF est un cadre. MVVM est également en cours actuellement appliquées dans d'autres technologies (il y a actuellement beaucoup de buzz sur le modèle MVVM pour le web, avec du JavaScript et des trucs comme ça)
Je vous conseille de lire les livres mentionnés dans d'autres réponses, aussi bien que ce Tutoriel pour plus d'WPF-aspects spécifiques.