2012-03-20 15 views
5

Sto costruendo un'applicazione per Windows Phone 7 e ho bisogno di un riferimento al mio ViewModel nella mia vista, così posso impostare una proprietà dal mio gestore di eventi. L'unico problema è che non sono in grado di ottenere quel riferimento.MVVMLight - come ottenere un riferimento a ViewModel nella vista?

Quello che ho fatto;

Ho un ViewModelLocator (cancellato i bit irrilevanti):

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

e una vista (XAML):

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

E il code-behind della vista:

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

    public Tuner() 
    { 
     _viewModel = DataContext as TunerViewModel; 

     InitializeComponent(); 
    } 

Ho trovato questo collegamento MVVM View reference to ViewModel in cui DataContext è convertito in un ViewModel, quindi ho provato la stessa b perché sembra una buona soluzione. Tuttavia, il mio campo _viewModel è nullo dopo il cast. Perché è questo e come posso risolvere questo? Non ho potuto trovare su Google/StackOverflow

Grazie in anticipo :)

+0

Ti è istituito il Locator nelle risorse App.xaml (o, in alternativa, ma non come DRY, nelle risorse di pagina)? Perché sembra che non stia trovando il viewmodel nel tuo binding XAML. – Robaticus

risposta

8

Perché si imposta la DataContext da XAML con un'espressione vincolante nel costruttore del Vedere le DataContext non è ancora impostato. Ecco perché ottieni null.

Prova il cast del DataContext o dopo l'evento Loaded:

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

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

Ah, è abbastanza stupido da parte mia. Grazie! –

+0

Per essere precisi, la chiave è ottenere la VM dopo la chiamata a InitializeComponent, perché è qui che viene analizzato XAML e dove viene creata la VM su richiesta. Quindi, in senso stretto, non hai bisogno dell'evento Loaded, devi solo impostare l'attributo _viewModel dopo la restituzione di InitializeComponent :) – LBugnion

+0

@LBugnion è il comportamento modificato in WP7? Perché in WPF se imposto 'DataContext' in XAML è' null' nel costruttore di usercontrol anche dopo la chiamata 'InitializeComponent()' ... – nemesv

Problemi correlati