2010-06-13 3 views
1

Je développe une application dans wpf en utilisant le modèle de conception MVVM. J'ai une boîte de liste quand un article est fendu alors une boîte de dialogue est ouverte ayant le même enregistrement en mode éditable. cette boîte de dialogue est liée à l'élément sélectionné de la liste. J'ai appliqué la règle de validation pour la zone de texte en utilisant IDataErrorInfo. Lorsque l'utilisateur met à jour un enregistrement dans la boîte de dialogue, à chaque pression de touche, l'enregistrement sélectionné dans la zone de liste est également modifié. Si l'utilisateur appuie sur le bouton Enregistrer, je soumets des modifications à la base de données. mais si l'utilisateur clique sur le bouton Annuler, je ne soumets pas les modifications à la base de données, mais la zone de liste est mise à jour avec la mise à jour en cours dans l'interface graphique. lorsque je rafraîchis la liste, l'ancienne valeur apparaît à nouveau. Mon exigence est de mettre à jour la zone de liste uniquement lorsque l'utilisateur appuie sur le bouton de sauvegarde, mais pas sur chaque touche de la boîte de dialogue. Je remplis d'abord la liste générique avec les classes linq to sql puis lie la listbox avec celle-ci. S'il vous plaît laissez-moi savoir ce que je dois faire.Validation d'entrée dans WPF

Merci à l'avance

Répondre

0

Le problème est que vous modifiez le même objet sur les deux formes. Vous devez passer le SelectedItem au formulaire de dialogue, mais ré-interroger la base de données pour l'élément qui a été transmis au constructeur. Cela a deux effets: vous permet d'annuler les modifications lorsque l'objet a été modifié et fournit à l'utilisateur les données les plus récentes de la base de données. Pensez-y de cette façon ... Si la zone de liste contenait des données datant de quelques minutes, votre utilisateur modifierait des données qui ont déjà été modifiées par un autre utilisateur exécutant votre application.

Une fois que l'utilisateur enregistre (ou supprime) l'enregistrement dans le formulaire de dialogue, vous devez actualiser la zone de liste. En général, j'utilise la méthode suivante:

DialogViewModel:

// Constructor 
public DialogViewModel(MyObject myObject) 
{ 
    // Query the database for the required object 
    MyObject = (from t in _dc.MyObjects where t.ID == myObject.ID 
       select t).Take(1).Single(); 
} 

// First define the Saved Event in the Dialog form's ViewModel: 
public event EventHandler Saved; 
public event EventHandler RequestClose; 

// Raise the Saved handler when the user saves the record 
// (This will go in the SaveCommand_Executed() method) 
    EventHandler saved = this.Saved; 
    if (saved != null) 
     saved(this, EventArgs.Empty); 

ListBox ViewModel

Views.DialogView view = new Views.DialogView(); 
DialogViewModel vm = new DialogViewModel(SelectedItem); // Pass in the selected item 

// Once the Saved event has fired, refresh the 
// list of items (ICollectionView, ObservableCollection, etc.) 
// that your ListBox is bound to 
vm.Saved += (s, e) => RefreshCommand_Executed(); 
vm.RequestClose += (s, e) => view.Close(); 
view.DataContext = vm; 
view.ShowDialog();