2009-04-17 86 views
11

我想從Silverlight(3)中使用MVVM模式從ChildWindow/popup中獲取數據的正確方法。例如:我有一個帶有數據輸入表單的主頁面,我想打開一個帶有客戶列表的彈出窗口。當用戶選擇一個客戶時,我想將選定的客戶轉移到主頁面。這是我使用的時刻將(例如)代碼:Silverlight MVVM模式中的子窗口

主頁

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

子窗口

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

這是正確的方式還是有什麼更「簡單」?

乾杯, 韓城

回答

6

更大的問題這裏採用的是在VM中查看具體條款和類型。 Click事件,DialogResults不應該在您的ViewModels附近。

至於這個問題,我對這個在這裏一個類似的問題: Handling Dialogs in WPF with MVVM

我接受的答案是使用調解模式來解決這個問題。看一看。 :)

+2

謝謝,我會看看。我發現我做的「完全」錯誤,我已經改變了我的代碼,使用命令(綁定到ICommand)並將dialogresult移出虛擬機。下一步是看調解員模式:) – rrejc 2009-04-20 12:39:49

+0

我同意調解員是要走的路。有關它的博客:http://basaratali.blogspot.com/2010/12/mediator-for-mvvmlight-like-one-by.html – basarat 2010-12-19 15:49:56