2009-04-17 17 views
11

Silverlight(3)のMVVMパターンを使用して、ChildWindow /ポップアップからデータを取得する正しい方法を見つけようとしています。たとえば、データ入力フォームのメインページがあり、顧客のリストを含むポップアップを開きたいとします。ユーザーが顧客を選択すると、選択した顧客をメインページに転送します。MVVMパターンのSilverlightの子ウィンドウ

メインページ

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で表示特有の用語や種類を使用することです。イベントをクリックすると、DialogResultsはViewModelsの近くにあるべきではありません。質問に関して

、私はここで、この程度似疑問を持っていた: Handling Dialogs in WPF with MVVM

を私は受け入れ答えは、これを回避するにはMediatorパターンを使用しました。見てみましょう。 :)

+2

ありがとう、私は見てみましょう。私はそれを「完全に間違っている」ことが分かりました。コマンド(ICommandへのバインディング)を使用してコードを変更し、VMからdialogresultを削除しました。次のステップはMediatorパターンを見ることです:) – rrejc

+0

私はメディエーターが行く方法であることに同意します。それについてのブログ:http://basaratali.blogspot.com/2010/12/mediator-for-mvvmlight-like-one-by.html – basarat

関連する問題