2012-03-20 19 views
5

Estoy construyendo una aplicación para Windows Phone 7, y necesito una referencia a mi ViewModel en mi vista para poder establecer una propiedad desde mi controlador de eventos. El único problema es que no puedo obtener esa referencia.MVVMLight: cómo obtener una referencia al ViewModel en la Vista?

Lo que hice;

Tengo un ViewModelLocator (suprimido los bits irrelevantes):

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

y una vista (XAML):

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

Y el código subyacente de la vista:

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

    public Tuner() 
    { 
     _viewModel = DataContext as TunerViewModel; 

     InitializeComponent(); 
    } 

Encontré este enlace MVVM View reference to ViewModel donde el DataContext se convierte en un ViewModel, así que probé lo mismo b Porque parece una buena solución. Sin embargo, mi campo _viewModel es nulo después del lanzamiento. ¿Por qué es esto y cómo soluciono esto? No podía encontrar en Google/Stackoverflow

Gracias de antemano :)

+0

¿Creó el Localizador de sus recursos App.xaml (o, como alternativa, pero no tan seco, en sus recursos de página)? Porque parece que no está encontrando el modelo de vista en su enlace XAML. – Robaticus

Respuesta

8

Debido a que se establece la DataContext de XAML con una expresión de enlace en el constructor del Ver las DataContext no está configurado todavía. Es por eso que obtienes nulo.

Pruebe el elenco del DataContext en o después del evento Loaded:

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

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

Ah, eso es bastante estúpido de mi parte. ¡Gracias! –

+0

Para ser exactos, la clave es obtener la máquina virtual después de llamar a InitializeComponent, porque aquí es donde se analiza el XAML y donde se crea la máquina virtual a pedido. Por lo tanto, estrictamente hablando, no necesita el evento Loaded, solo necesita configurar su atributo _viewModel después de que InitializeComponent devuelva :) – LBugnion

+0

@LBugnion es el comportamiento cambiado en WP7? Porque en WPF si configuro 'DataContext' en XAML es' null' en el constructor del usuariocontrol incluso después de la llamada 'InitializeComponent()' ... – nemesv

Cuestiones relacionadas