2011-02-15 8 views
5

私は非常に基本的な質問をしている場合私はMVVWパターンの新しいですので、あなたは私を許す必要があります。1つのViewModelからMVVWの別のViewModelにイベントを伝播する方法はありますか?

私は2つのViewModelを持っています。私たちはそれらをTreeViewViewModelとListViewViewModelと呼びます。 TreeViewViewModelは、ビュー内のIsSelectedプロパティにバインドされます。 IsSelectedが変更されるたびに、ListViewViewModelにそのビューを更新できるように通知する必要があります。

オンラインでの調査の結果、良い解決策に見えるようなEventAggregatorを見つけました。

これは適切な解決策ですか?もしそうなら、これを実装するにはどうすればいいですか?または、私が検討すべきよりよい解決策がありますか?以下は、EventAggregatorがイベントを公開するViewModelに統合されていると思われる方法の簡略版です。

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

答えて

3

あなたは確かにイベントアグリゲータを使用することができますが、このような単純なもののための1を必要としません。あなたは単にListViewViewModelTreeViewViewModel.PropertyChangedを聞くことができます。

+0

これは、2つのビューモデルの間の直接の参照を作成し、それはないでしょうか? MVVWについての私の理解は、これが強く推奨されないことです...しかし、フレームワークガイドラインへの厳格な遵守は、何の利益ももたらさない場合があることを認めています。 – Nathanael

+0

これは強く推奨されていませんでした。ビューモデル間に関係がある場合は、互いに参照を保持するのは完全に賢明です。たとえば、http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090016のMainWindowViewModelとWorkspaceViewModelの関係を参照してください。 –

2

EventAggregatorは適切なオプションであり、コードは私に似ています。 他のオプションはSharedServiceであるか、単純にあるビューモデルから別のビューモデルに直接参照することです。 プリズムフレームワークは、このトピックの素敵なドキュメントがあります。 http://msdn.microsoft.com/en-us/library/ff921122(v=PandP.40).aspx

関連する問題