2011-02-15 28 views
5

Tôi là thương hiệu mới với mẫu MVVW, vì vậy bạn sẽ phải tha thứ cho tôi nếu tôi hỏi một câu hỏi rất cơ bản.Làm cách nào để truyền bá sự kiện từ một ViewModel sang một ViewModel khác trong MVVW?

Tôi có hai Chế độ xem, chúng tôi sẽ gọi chúng là TreeViewViewModel và ListViewViewModel. TreeViewViewModel liên kết với một thuộc tính IsSelected trong khung nhìn của nó. Bất cứ khi nào IsSelected thay đổi, tôi cần phải thông báo cho ListViewViewModel để nó có thể cập nhật nó xem.

Sau khi một số nghiên cứu trực tuyến, tôi đã đi qua EventAggregator trông giống như nó có thể là một giải pháp tốt.

Đây có phải là giải pháp phù hợp không? Nếu vậy, làm thế nào tôi nên đi về việc thực hiện điều này? Hoặc, có một giải pháp tốt hơn tôi nên xem xét? Dưới đây là một phiên bản đơn giản về cách tôi nghĩ EventAggregator có thể được tích hợp vào ViewModel xuất bản sự kiện.

public class TreeViewViewModel : INotifyPropertyChanged 
{ 
    public bool IsSelected 
    { 
     get { return _isSelected; } 
     set 
     { 
      if (value == _isSelected) 
       return; 

      _isSelected = value; 

      OnPropertyChanged("IsSelected"); 

      // Is this sane? 
      _eventAggregator.GetEvent<TreeViewItemSelectedEvent>().Publish(value); 
     } 
    } 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Trả lời

3

Bạn chắc chắn có thể sử dụng trình tổng hợp sự kiện, nhưng bạn không cần một cái gì đó đơn giản như thế này. Bạn chỉ có thể có ListViewViewModel nghe TreeViewViewModel.PropertyChanged.

+0

Điều này sẽ tạo tham chiếu trực tiếp giữa hai Mô hình xem? Sự hiểu biết của tôi về MVVW là điều này không được khuyến khích mạnh mẽ ... nhưng tôi thừa nhận sự tuân thủ nghiêm ngặt các nguyên tắc khung đôi khi tạo thêm công việc không có lợi ích. – Nathanael

+0

Bạn lấy ý tưởng nào về điều này là không khuyến khích? Nếu có mối quan hệ giữa các mô hình xem, điều đó hoàn toàn hợp lý để họ giữ tham chiếu với nhau. Xem, ví dụ, mối quan hệ giữa MainWindowViewModel và WorkspaceViewModel trong http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090016. –

2

EventAggregator là một lựa chọn tốt và mã của bạn trông đúng với tôi. Các tùy chọn khác sẽ là SharedService hoặc chỉ đơn giản là có tham chiếu trực tiếp từ một chế độ xem sang mô hình khác. Khuôn khổ lăng kính có tài liệu hay về chủ đề này: http://msdn.microsoft.com/en-us/library/ff921122(v=PandP.40).aspx

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