2009-04-17 40 views
11

Tôi đang cố tìm đúng cách để lấy dữ liệu từ ChildWindow/popup bằng mẫu MVVM trong Silverlight (3). Ví dụ: Tôi có một trang chính với biểu mẫu nhập dữ liệu và tôi muốn mở cửa sổ bật lên có danh sách khách hàng. Khi người dùng chọn một khách hàng tôi muốn chuyển khách hàng đã chọn vào trang chính. Đây là những gì (ví dụ) mã mà tôi đang sử dụng tại thời điểm này:Cửa sổ con Silverlight trong mẫu MVVM

Trang chính

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

cửa sổ Child

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

Đây có phải là đúng cách hoặc là có bất cứ điều gì thêm "đơn giản"?

Chúc mừng, Rok

Trả lời

6

vấn đề hơn ở đây là việc sử dụng các điều kiện cụ thể Xem và loại trong máy ảo của bạn. Nhấp vào các sự kiện, DialogResults không nên ở bất kỳ đâu gần ViewModels của bạn.

Liên quan đến câu hỏi, tôi có một câu hỏi tương tự về vấn đề này ở đây: Handling Dialogs in WPF with MVVM

Câu trả lời tôi chấp nhận là việc sử dụng các mô hình Trung Gian để làm được việc này. Có một cái nhìn. :)

+2

Cảm ơn, tôi sẽ xem xét. Tôi đã phát hiện ra rằng tôi đang làm nó "hoàn toàn" sai và tôi đã thay đổi mã của tôi để sử dụng lệnh (ràng buộc với ICommand) và loại bỏ dialogresult ra khỏi máy ảo. Bước tiếp theo là xem xét mẫu hòa giải :) – rrejc

+0

Tôi đồng ý hòa giải là con đường để đi. Đã viết blog về nó: http://basaratali.blogspot.com/2010/12/mediator-for-mvvmlight-like-one-by.html – basarat

Các vấn đề liên quan