2017-11-01 29 views
0

これはダンプのサブタイトルになるかもしれませんが、この問題を要約する方法はわかりません。MVVMLight複数のインスタンス化されたViewModels対応するビュー

まず、MVVMとMVVMLightが初めてです。

特定のビューモデル(例:GalleryViewModel)の複数のインスタンスを作成し、対応するビューを対応するビューに表示しようとしました。対応するビューは、GalleryViewModelの特定のインスタンスにバインドされています。したがって、ユーザは、例えば、5つのGalleryViewを開いており、バックグラウンドでは、各GalleryViewを対応するGalleryViewModelにバインドしなければならない。

したがって、私はInstanceKeyとしてGUIDを持つSimpleIoCの "GetInstance"を呼び出します。

ビューモデルのデータが変更されたときに、ビューが更新されないという問題があります。私はインスタンス・キーを使ってビューモデルをインスタンス化するときにのみこれが当てはまることを知りました。

だから私はリンクする必要があります/バインドするインスタンスビューXYとそのviewmodelに現在のビュー。しかし、私はそれを行う方法を知らない。

私の "architecture"は次のようなものです:MainViewModelはGetInstance(GUID)メソッドを呼び出します。 MainView内では、新しいUserControlがGalleryViewで表示/作成されます。そのdatacontextはXAML経由でGalleryViewModelにバインドされています(ただし、このバインディングはGUIDを認識できないため、間違ったインスタンス(?)にバインドされ、DataBindingsが更新されない可能性があるため問題になる可能性があります。

ViewModelLocatorが唯一のインスタンスを返します(たぶんそれが問題だ)

public GalleryMainViewModel Gallery 
{ 
    get { return ServiceLocator.Current.GetInstance<GalleryMainViewModel>(); } 
} 

私のアプリケーションが今NavigationInterface(の欠けているものの、「ナビゲーション」が(呼び出さMainViewModel内から:ここに

はいくつかのコードです)。

private void DoOpenTab(string windowname, string payload = null) 
     { 
      DockWindowViewModel window; 
      string guid;    
      switch(windowname) 
      {      
       case "Gallery": 
        guid = Guid.NewGuid().ToString(); 
        window = ServiceLocator.Current.GetInstance<GalleryMainViewModel>(guid); 
        window.ViewModelInstanceKey = guid; 
        Messenger.Default.Send(
         new NotificationMessage(payload), 
         (window as GalleryMainViewModel).MessageToken); 
        DockManagerViewModel.AddDocument(window); 
        break; 
      } 
     } 

そして(アバロンDockManager-タブ内に配置されているユーザーコントロールである)GalleryViewは、この

<src:PluginView 
    DataContext="{Binding Gallery, Source={StaticResource Locator}}" 
    <!-- just normal bindings. --> 
</src:PluginView> 

のように、私は誰かが私に少しを助けることができる、願って見えます。私は本当にソリューションに近いと感じていますが、私は本当にそれを完全に解決する方法を知らない。

ありがとうございます!

答えて

1

これはあなたのロケータに

public GalleryMainViewModel Gallery 
    { 
     get { return ServiceLocator.Current.GetInstance<GalleryMainViewModel>(); } 
    } 

であり、これはその後、VMがGUIDを使用してビューにバインドされたことはありません潜在で作成したビューで

<src:PluginView 
    DataContext="{Binding Gallery, Source={StaticResource Locator}}" 
    <!-- just normal bindings. --> 
</src:PluginView> 

ある場合。ビューが通知メッセージを受け取ったときに何が起こるかによって異なります。

上記のコードは、ビューに、Galleryプロパティを介してロケータからDataContextを直接取得するように指示しています。これは、このビューのすべてのインスタンスに対して同じインスタンスになります。

+0

ありがとう、それは私が想定しているものです。どうすればその行動を変えることができますか?これは私にとって初めてのことです。私は理論的に何をすべきかを知っていると思いますが、コードでどのように行うのか分かりません。したがって、要するに、ビューを特定のVMインスタンスにバインドする方法は?コードビハインドでそれをやらなければならないのですか、それともVMからVへ、またはVからVMへの通知メッセージを介して行う必要がありますか?あなたはどうしますか? – MikeRoss

+1

UserControlとVMが内部で何を行い、どのレベルのデカップリングを達成するかによって、さまざまなアプローチがあります。 VMが内蔵されていて、UserControlを閉じた後でVMを必要としない場合、最も簡単な方法は、Locatorに毎回Guid.NewGuid()。ToString()を配置して一意のインスタンスを返すことですロケータで – Sharpy

+0

ユーザーがビューを閉じると、ビューモデルも破棄される可能性があります。この特定のケースでは、ユーザーはこのvm-v-combinationを使用しないように「宣言します」。もしそうなら、彼はそのギャラリーを再び開くことができます(新しいvm-v-guid-pairを作ります)。正しい?ユーザーが同じペアを再利用/再オープンしたいときには何ができるでしょうか? – MikeRoss

関連する問題