2009-04-17 6 views
11

J'essaie de trouver le bon moyen d'obtenir les données à partir d'un ChildWindow/popup en utilisant un modèle MVVM dans Silverlight (3). Par exemple: J'ai une page principale avec un formulaire de saisie de données et je veux ouvrir une popup avec une liste de clients. Lorsque l'utilisateur sélectionne un client, je veux transférer le client sélectionné dans la page principale. C'est ce que (par exemple) le code que je me sers au moment:Fenêtres enfants Silverlight dans le modèle MVVM

Page principale

public partial class MainPage : UserControl 
{ 
    public MainPageViewModel ViewModel { get; private set; } 

    public MainPage() 
    { 
     InitializeComponent(); 
     ViewModel = new MainPageViewModel(); 
     DataContext = ViewModel; 
    } 

    private void SearchCustomer_Click(object sender, RoutedEventArgs e) 
    { 
     ViewModel.SearchCustomer(); 
    } 
} 

public class MainPageViewModel: ViewModel 
{ 
    private string customer; 
    public string Customer 
    { 
     get { return customer; } 
     set { customer = value; RaisePropertyChanged("Customer"); } 
    } 

    public void SearchCustomer() 
    { 
     // Called from a view 
     SearchWindow searchWindow = new SearchWindow(); 
     searchWindow.Closed += (sender, e) => 
     { 
      if ((bool)searchWindow.DialogResult) 
      { 
       Customer = searchWindow.ViewModel.SelectedCustomer.ToString(); 
      } 
     }; 
     searchWindow.Show(); 
    } 
} 

fenêtre enfant

public partial class SearchWindow : ChildWindow 
{ 
    public SearchWindowViewModel ViewModel { get; private set; } 

    public SearchWindow() 
    { 
     InitializeComponent(); 
     ViewModel = new SearchWindowViewModel(); 
     DataContext = ViewModel; 
    } 

    private void OKButton_Click(object sender, RoutedEventArgs e) 
    { 
     DialogResult = ViewModel.OkButtonClick(); 
    } 

    private void CancelButton_Click(object sender, RoutedEventArgs e) 
    { 
     DialogResult = ViewModel.CancelButtonClick(); 
    } 
} 

public class SearchWindowViewModel: ViewModel 
{ 
    private Customer selectedCustomer;   
    private ObservableCollection<Customer> customers; 

    public ObservableCollection<Customer> Customers 
    { 
     get { return customers; } 
     set {customers = value; RaisePropertyChanged("Customers"); } 
    } 

    public Customer SelectedCustomer 
    { 
     get { return selectedCustomer; } 
     set { selectedCustomer = value; RaisePropertyChanged("SelectedCustomer"); } 
    } 

    public SearchWindowViewModel() 
    { 
     Customers = new ObservableCollection<Customer>(); 
     ISearchService searchService = new FakeSearchService(); 
     foreach (Customer customer in searchService.FindCustomers("dummy")) 
      Customers.Add(customer); 
    } 

    public bool? OkButtonClick() 
    { 
     if (SelectedCustomer != null) 
      return true; 
     else 
      return null; // show some error message before that 
    } 

    public bool? CancelButtonClick() 
    { 
     return false; 
    } 
} 

Est-ce la bonne façon ou est-il quoi de plus "simple"?

Cheers, Rok

Répondre

6

Plus problématique ici est l'utilisation de termes spécifiques et Voir types dans vos machines virtuelles. Cliquez sur les événements, DialogResults ne doit pas être à proximité de vos ViewModels.

En ce qui concerne la question, j'avais une question similaire à ce sujet ici: Handling Dialogs in WPF with MVVM

La réponse que j'ai accepté a été l'utilisation du modèle de médiateur pour contourner cela. Regarde. :)

+2

Merci, je vais jeter un oeil. J'ai découvert que je le fais "complètement" faux et j'ai déjà changé mon code pour utiliser des commandes (liaison à ICommand) et enlever le résultat de dialogue de la machine virtuelle. La prochaine étape est de regarder le modèle Mediator :) – rrejc

+0

Je suis d'accord mediator est le chemin à parcourir. Blogué à ce sujet: http://basaratali.blogspot.com/2010/12/mediator-for-mvvmlight-like-one-by.html – basarat

Questions connexes