2009-04-17 13 views
11

Próbuję znaleźć właściwy sposób na uzyskanie danych z okna ChildWindow/popup za pomocą wzorca MVVM w Silverlight (3). Na przykład: Mam stronę główną z formularzem wprowadzania danych i chcę otworzyć wyskakujące okienko z listą klientów. Kiedy użytkownik wybiera klienta, chcę przenieść wybranego klienta na stronę główną. To właśnie (przykład) kod, który używam w tej chwili:Okna podrzędne Silverlight w wzorcu MVVM

strona główna

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(); 
    } 
} 

okna potomnego

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; 
    } 
} 

Czy to właściwa droga, czy też istnieje coś bardziej "prostego"?

Cheers, rok

Odpowiedz

6

Bardziej problematyczne jest tu użycie widzenia konkretnych warunków i typu maszyn wirtualnych. Kliknij zdarzenia, okna dialogowe DialogResult nie powinny znajdować się w pobliżu twoich modeli ViewModels.

W odniesieniu do kwestii, miałem similiar pytanie o to tutaj: Handling Dialogs in WPF with MVVM

Odpowiedź przyjąłem było wykorzystanie wzoru Mediator aby obejść ten problem. Spójrz. :)

+2

Dzięki, przyjrzę się. Dowiedziałem się, że robię to "całkowicie" źle i już zmieniłem swój kod, aby użyć poleceń (powiązanie z ICommand) i usunąć polecenia dialogowe z VM. Następnym krokiem jest spojrzenie na wzór Mediatora :) – rrejc

+0

Zgadzam się, mediator jest drogą do zrobienia. Blogowane na ten temat: http://basaratali.blogspot.com/2010/12/mediator-for-mvvmlight-like-one-by.html – basarat

Powiązane problemy