2016-04-11 14 views
1

私はMVVMに入り、Prismフレームワークから始めました。サンプルアプリケーションでは典型的なナビゲーションがあります。ページの1つにいくつかのアプリケーションがリストされていなければなりません。実装の違いについては不思議でした。ここではそれをシンプルに保つために、コードからいくつかの小さな断片は、これまで以下のとおりです。ObservableCollectionイベントの伝達とMVVMの正しい使い方

アプリケーションモデル

public class Application : BindableBase 
{ 
    private string _commandLine; 
    private string _name; 
    private string _smallIconSource; 

    public string CommandLine 
    { 
     get { return _commandLine; } 
     set { SetProperty(ref _commandLine, value); } 
    } 

    public string Name 
    { 
     get { return _name; } 
     set { SetProperty(ref _name, value); } 
    } 

    public string SmallIconSource 
    { 
     get { return _smallIconSource; } 
     set { SetProperty(ref _smallIconSource, value); } 
    } 
} 

ApplicationPageのViewModel

public class ApplicationPageViewModel : BindableBase 
{ 
    private ObservableCollection<Application> _applicationCollection; 

    public ApplicationPageViewModel() 
    { 
     // load some collection entries here 
    } 

    public ObservableCollection<Application> ApplicationCollection 
    { 
     get { return _applicationCollection; } 
     set 
     { 
      // if (_applicationCollection != null) 
      //  _applicationCollection.CollectionChanged -= ApplicationCollectionChanged; 
      SetProperty(ref _applicationCollection, value); 
      // if (_applicationCollection != null) 
      //  _applicationCollection.CollectionChanged += ApplicationCollectionChanged; 
     } 
    } 
} 

ApplicationPageビュー

<!-- ... --> 
<ItemsControl ItemsSource="{Binding ApplicationCollection}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Vertical" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <!-- some kind of representation of applications --> 
      <Label Content="{Binding Name}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
<!-- ... --> 

インターネット上のいくつかのコードサンプル、特にSOに関するいくつかの質問では、私が行ったようにViewModelsのObservableCollectionを保存するかどうかを質問しましたが、モデルは表示しませんでした。それらのバージョンは他のものよりも?

はさらに私はApplicationクラスの変化がApplicationPageViewModelクラスに反映させるか、私はCollectionChangedイベントにフックする必要がある場合には(私はこのテクニックを見たブライアンLagunas'ウェビナーから見た)かどうかを知ることに興味がありました。これまでのところ私はDelegateCommands場合RelayCommand Sの次の実装を持つときunnecesary膨張/呼び出しを防ぐために、手動でRaiseCanExecuteChangedメソッドを呼び出すためにCollectionChangedイベントにこのフックを見てきました:

public event EventHandler CanExecuteChanged 
{ 
    add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 
+0

あなたの質問は基本的に、それらが変更されたコレクションに関するアイテムを通知する方法です。 1)ViewModelインスタンスを各アイテム(コンストラクタなど)に渡します。アイテムはViewModelのイベントにサブスクライブできます。イベントはViewModel(またはアイテムによっても)によって上げられます。2)ViewModelはすべての変更と通知を(呼び出しによって)処理します。コレクションの変更に関する各アイテムメソッド)。 'INotifyPropertyChanged'(これはあなたが聞いているイベントです)を実装すると、メソッド(1)がボックスの外に出てきます。 – Sinatr

答えて

0

プロパティであれば、私はのviewmodelsを使用しますあなたのコレクションは変わります。アイテムのデータが変更されない場合は、VMまたはモデルを使用していて、それを好む方法であれば、実際には違いはありません。 ViewModelsで私のモデルをラップするのは個人的には好きです。私はモデルに直接持っていたくない組み合わせたプロパティを簡単に表示することができます。

あなたは、アプリケーションの変更は、あなたが

に持ったときに
  • アプリケーションのためのViewModelを使用ApplicationPageViewModelに何らかのアクションを実行したい場合は
  • 各アプリケーションのViewModel
  • 毎回のINotifyPropertyChangedのイベントをフックアップします新しいアプリケーションを追加し、このアプリケーションにリスナーを追加する

アプリケーションが追加されたときに何らかのアクションを実行したい場合はViewModelを使用する必要はなく、ObservableCollectionのCollectionChangedイベントを登録するだけです。

+0

これはいくつかの問題を解決します。それでもあなたがViewModelsを使用して、あなたが間違いなくファサードパターンに依存しているいくつかの結合されたプロパティを含むのではないかと思いますか?この承認は、保守性をより複雑にし、非表示にしたくない同じプロパティにアクセスするために重複したコードを書くように強制しませんか? –

+0

私の現在のプロジェクトでは、いくつかのプロパティやビュー依存の機能を追加するだけのViewModelにDynamicObjectラッパーを使用しています。私はプロパティのコードを複製する必要はありませんが、ViewModelのモデルを割り当てるだけですむので、非常に便利です。 私のモデルでは、INotifyPropertyChangedインターフェイスを実装していないため、データを保持するだけなので、変更に登録する方法はありません。 – Spongebrot

関連する問題