2012-03-20 5 views
5

私はWindows Phone 7アプリケーションを構築しています。自分のビューでViewModelへの参照が必要なため、イベントハンドラからプロパティを設定できます。唯一の問題は、私がその参照を得ることができないということです。MVVMLight - ビューでViewModelへの参照を取得するには?

私は何をしましたか。

static ViewModelLocator() 
{ 
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

    SimpleIoc.Default.Register<TunerViewModel>(); 
} 

[SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification = "This non-static member is needed for data binding purposes.")] 
public TunerViewModel Tuner 
{ 
    get { return ServiceLocator.Current.GetInstance<TunerViewModel>(); } 
} 

とビュー(XAML):

DataContext="{Binding Tuner, Source={StaticResource Locator}}"> 

とビューのコードビハインド:

public partial class Tuner : PhoneApplicationPage 
{ 
    private readonly TunerViewModel _viewModel; 

    public Tuner() 
    { 
     _viewModel = DataContext as TunerViewModel; 

     InitializeComponent(); 
    } 

IはViewModelLocator(削除された無関係なビット)を有します

このリンクが見つかりましたMVVM View reference to ViewModel DataContextがViewModelにキャストされているので、それは良い解決策のように見える。しかし、_viewModelフィールドはキャストの後ではnullです。なぜこれが問題なのですか?あなたはDataContextがまだ設定されていないビューのコンストラクタでバインディング式にXAMLからDataContextを設定しているので、私はGoogleの/ StackOverflowの上、事前:)

+0

はあなたのApp.xamlリソースにロケータを設定しました(あるいはしますが、あなたのページのリソースでは、のように乾燥していませんか)?これは、XAMLバインディングでviewmodelが見つからないように見えるためです。 – Robaticus

答えて

8

おかげでそれを見つけることができませんでした。だから、あなたはnullを取得します。

は、キャストやLoadedイベントの後DataContext試してみてください。

public Tuner() 
{ 
    InitializeComponent(); 
    Loaded += OnTunerLoaded; 
} 

private void OnTunerLoaded(object sender, RoutedEventArgs routedEventArgs) 
{ 
    _viewModel = DataContext as TunerViewModel; 
} 
+0

ああ、それは私のことはかなりばかです。ありがとう! –

+0

正確には、InitializeComponentが呼び出された後で、XAMLが解析され、必要に応じてVMが作成される場所であるため、キーはVMを取得することです。したがって、厳密に言えば、Loadedイベントは必要ありません。InitializeComponentが返った後に_viewModel属性を設定するだけです。 – LBugnion

+0

@LBugnionはWP7で変更された動作ですか?なぜなら、WPFでは、XAMLで 'DataContext'を設定しているのは、' InitializeComponent() '呼び出しの後でも、usercontrolのコンストラクタで' null'です。 – nemesv

関連する問題