これはダンプのサブタイトルになるかもしれませんが、この問題を要約する方法はわかりません。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>
のように、私は誰かが私に少しを助けることができる、願って見えます。私は本当にソリューションに近いと感じていますが、私は本当にそれを完全に解決する方法を知らない。
ありがとうございます!
ありがとう、それは私が想定しているものです。どうすればその行動を変えることができますか?これは私にとって初めてのことです。私は理論的に何をすべきかを知っていると思いますが、コードでどのように行うのか分かりません。したがって、要するに、ビューを特定のVMインスタンスにバインドする方法は?コードビハインドでそれをやらなければならないのですか、それともVMからVへ、またはVからVMへの通知メッセージを介して行う必要がありますか?あなたはどうしますか? – MikeRoss
UserControlとVMが内部で何を行い、どのレベルのデカップリングを達成するかによって、さまざまなアプローチがあります。 VMが内蔵されていて、UserControlを閉じた後でVMを必要としない場合、最も簡単な方法は、Locatorに毎回Guid.NewGuid()。ToString()を配置して一意のインスタンスを返すことですロケータで – Sharpy
ユーザーがビューを閉じると、ビューモデルも破棄される可能性があります。この特定のケースでは、ユーザーはこのvm-v-combinationを使用しないように「宣言します」。もしそうなら、彼はそのギャラリーを再び開くことができます(新しいvm-v-guid-pairを作ります)。正しい?ユーザーが同じペアを再利用/再オープンしたいときには何ができるでしょうか? – MikeRoss