2010-02-18 4 views
3

Je travaille sur une application MVVM et une vue qui permet de modifier un certain nombre de paramètres réseau (IP, SubnetMask, etc.).MVVM UpdateSourceTrigger

La vue contient un certain nombre de zones de texte liées aux propriétés dans un NetworkConfigViewModel:

<TextBox> 
    <TextBox.Text> 
     <Binding Path="IP" UpdateSourceTrigger="PropertyChanged"/> 
    </TextBox.Text> 
</TextBox> 

... etc 

La vue contient également un bouton appelé Save Configuration. Le bouton est lié à un RelayCommand dans le ViewModel qui prend soin d'enregistrer la configuration sur le périphérique distant sur demande. Je voudrais modifier les liaisons de la zone de texte pour utiliser UpdateSourceTrigger="Explicit" de sorte que le ViewModel ne soit mis à jour que lorsque l'utilisateur clique explicitement sur «Enregistrer la configuration», plutôt que de mettre à jour lorsque les valeurs sont modifiées.

Je comprends que je vais devoir appeler BindingExpression.UpdateSource() pour chaque zone de texte. Comment puis-je faire cela d'une manière conviviale MVVM? L'ajout d'un nouveau RelayCommand au ViewModel qui connaît les éléments de l'interface utilisateur ne semble pas correct.

Répondre

1

Exactement, laissant ViewModel savoir sur View trop est pas bon. Je ferais mieux de mettre à jour une copie des paramètres, et laisser la liaison faire tout fonctionne pour moi. Une fois que le bouton de configuration Enregistrer 'utilisateur clique, je propager d'autres changements dans le référentiel, modèle ou autre ...

1

Ne pas mettre en œuvre cette fonctionnalité dans les fixations à votre modèle de vue. Implémentez-le dans votre modèle de vue. Les propriétés du modèle de vue doivent toujours refléter ce qui se trouve dans la vue. Il s'agit d'un modèle de vue car il s'agit d'un modèle de la vue, après tout.

Je devine que vous vous posez cette question parce que vous avez mis en place le modèle de vue avec des propriétés comme ceci:

public string MyProperty 
{ 
    get { return _Model.MyProperty; } 
    set 
    { 
     _Model.MyProperty=value; 
     OnPropertyChanged("MyProperty"); 
    } 
} 

Ne faites pas cela. Stockez les valeurs de propriétés dans des zones de sauvegarde privées et mettez à jour les propriétés du modèle dans la méthode "Save Configuration".

+0

"on l'appelle un modèle de vue parce que c'est un modèle de la vue" - Je pensais que c'était une vue du modèle – StingyJack

1

Donc, se référant à votre exemple:

Si le ViewModel a des champs de support privé pour ses propriétés au lieu d'exposer les propriétés du modèle comme soi-

private string _myProperty; 

public string MyProperty 
{ 

    get { return _myProperty; } 
    set 
    { 
     if (_myProperty != value) 
     { 
      _myProperty = value; 
      OnPropertyChanged("MyProperty"); 
     } 
    } 
} 

Quelles seront les contrôles dans la vue lier à? Si vous vous liez à une propriété qui expose uniquement un champ de sauvegarde privé, comment des données entreraient-elles dans la vue? Par exemple, un TextBox ne peut plus se lier à la propriété ViewModel, MyProperty, car il n'expose pas Model.MyProperty. Il expose simplement _myProperty. Si vous ne liez à Model.MyProperty comme si dans la vue:

<TextBox Text="{Binding Model.MyProperty, UpdateSourceTrigger=Explicit}" /> 
<Button Command="{Binding SaveCommand}" /> 

... vous obtiendrez des données dans la zone de texte. Maintenant, comment pouvons-nous mettre à jour le modèle avec la valeur mise à jour de la TextBox lorsque le bouton Enregistrer est pressé?

private void SaveExecute() 
{ 
    // How do we update the Model.MyProperty value? 
}