2013-06-04 18 views
8

メインビューのContentControlに表示される特定の量のUserControlsで使用しているアイテムのリストを含むメインViewModelがあります。 ViewModels間のデータ交換の現在の方法は、ViewModelViewModelsと、UserControlのメインViewModelの1つのそれぞれへの参照を作成しています。しかし、私はViewModelLocatorを持っているので、これが正しい方法であるかどうかはわかりません。このクラスには、このようなものをサポートするいくつかの機能があると思います。MVVM Lightの他のViewModelのプロパティへのアクセス

誰でも私がこれをやっていることを教えてもらえますか、それともMVVM Lightでこれを行う良い方法があれば教えてください。

EDIT:

私は別の何かを探していたとき、私は、これを見つけた、これは、より良い解決策でしょうか?

private ViewModelLocator locator = new ViewModelLocator(); 

ロケータのプロパティを使用して各ViewModelを参照しますか?

EDIT2:

はどうやら、私が仕事だろうと思ったものを、最初に私がメインViewModelでのみ参照を持っていない、これは働いていたが、私はUserControlsでこれをしようとすると、それは一種の私のアプリがクラッシュします。私は現在、最初の編集の可能な解決策を試みています。

MainViewModel.cs

public class MainViewModel : ViewModelBase 
{ 
    private ItemAddViewModel itemAddViewModel; 
    private ItemsViewModel itemsViewModel; 

    /// <summary> 
    /// Initializes a new instance of the MainViewModel class. 
    /// </summary> 
    public MainViewModel() 
    { 
     ItemsList = Item.GetItemsList(); 

     itemAddViewModel = ServiceLocator.Current.GetInstance<ItemAddViewModel>(); 
     itemsViewModel = ServiceLocator.Current.GetInstance<ItemsViewModel>(); 

     ShowItemsView(); 
    } 
... 
    private void ShowItemsView() 
    { 
     CurrentControl = itemsViewModel; 
    } 
... 

答えて

17

あなたが実際にViewModelLocatorを使用することができます(他は本体のみのViewModelを参照して、類似しています)。デフォルトではInversion of Control Containerを使用しているため、Locatorの新しいインスタンスを作成しても、コンテナからのシングルトンビューモデルの同じインスタンスが取得されます。

ロケータクラス:

static ViewModelLocator() 
{ 
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 
    SimpleIoc.Default.Register<ViewModel1>(); 
    SimpleIoc.Default.Register<ViewModel2>(); 
    SimpleIoc.Default.Register<ViewModel3>(); 
} 

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

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

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

、コードからあなたはのviewmodelの唯一のインスタンスを取得

var vm1 = (new ViewModelLocator()).ViewModel1; 

としてそれにアクセスすることができます。 XAMLから

: リソース(defaultly App.xamlでApplication.Resourcesである)のビュー(ユーザーコントロールまたはウィンドウのいずれかまたは何でも)のため

<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> 

とDataContextの

<UserControl 
    ... 
    DataContext="{Binding ViewModel1, Source={StaticResource Locator}}" 
    ... > 
+0

あなたは正しいです、私はちょうどこれをテストして、それが必要なので、詳細なソリューションのおかげで、それは非常に感謝して動作します! :) – Kryptoxx

+0

私はそれがうれしかった:)。もちろん、より洗練されたIOCコンテナを使用することもできます。これにより、シングルトンのビューモデルやコンストラクタの依存関係注入よりも多くのトリックを行うことができます。シンプルなIOCは単純です... – eMko

1

すべての場合コンテンツコントロール内で、メインのビューモデルからプロパティをバインドする必要があります。

... Binding="{DataContext.mainvmpropertyname, ElementName=xxxx}" 

ここで、xxxxはコンテンツコントロール(またはDataContextとしてメインビューモデルを持つコントロール)に付けられた名前です。また、要素名の代わりに相対バインディングを使用することもできます。

1

あなたはアプリのリソースからロケータを取得することにより、プログラム的にViewModelにロケータのパブリックプロパティにアクセスできます。

MyViewModel vm = (App.Current.Resources["Locator"] as ViewModelLocator).MyViewModel 

またはViewModelLocatorクラスに別の静的インスタンスを作成することによって:

public class ViewModelLocator 
{ 
    public static ViewModelLocator Instance = new ViewModelLocator(); 

    static ViewModelLocator(){ ... } 

    public MainViewModel Main 
    { 
    ... 
    } 
} 

Similar Thread

関連する問題