2012-03-20 13 views
5

Buduję aplikację Windows Phone 7, i potrzebuję odwołania do mojego ViewModel w moim widoku, więc mogę ustawić właściwość z mojej obsługi zdarzenia. Jedyny problem polega na tym, że nie jestem w stanie uzyskać tego odniesienia.MVVMLight - jak uzyskać odniesienie do ViewModel w widoku?

Co zrobiłem;

Mam ViewModelLocator (skreślony nieistotne bitów):

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>(); } 
} 

i widokiem (XAML):

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

a kod opóźnieniem widoku:

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

    public Tuner() 
    { 
     _viewModel = DataContext as TunerViewModel; 

     InitializeComponent(); 
    } 

Znalazłem ten link MVVM View reference to ViewModel gdzie DataContext jest rzutowany na ViewModel, więc próbowałem tego samego b bo to wygląda na dobre rozwiązanie. Jednak moje pole _viewModel ma wartość null po rzutowaniu. Dlaczego tak jest i jak to naprawić? Nie mogłem go znaleźć na Google/Stackoverflow

Z góry dzięki :)

+0

Czy ustanowiony lokalizatora w swoich zasobach App.xaml (lub alternatywnie, ale nie jako suchy, w zasobach stron)? Ponieważ wygląda na to, że nie znajduje to viewmodel w twoim powiązaniu XAML. – Robaticus

Odpowiedz

8

Bo ustawić DataContext z XAML z wiążącej wypowiedzi w konstruktorze widoku był na DataContext nie jest jeszcze ustalone. Dlatego otrzymujesz zero.

Spróbuj rzucić DataContext lub po zdarzeniu Loaded:

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

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

Ah, to jest dość głupie ze mnie. Dzięki! –

+0

Dokładniej, kluczem jest uzyskanie VM po wywołaniu InitializeComponent, ponieważ jest to miejsce, w którym XAML jest analizowany i gdzie VM jest tworzona na żądanie. Tak więc, ściśle mówiąc, nie potrzebujesz zdarzenia Loaded, wystarczy ustawić atrybut _viewModel po zwróceniu wartości InitializeComponent :) – LBugnion

+0

@LBugnion to zachowanie zmienione w WP7? Ponieważ w WPF, jeśli ustawię "DataContext" w XAML, jest to "null" w konstruktorze użytkownika nawet po wywołaniu 'InitializeComponent()' ... – nemesv

Powiązane problemy