2012-03-20 20 views
5

Bir Windows Phone 7 uygulaması yapıyorum ve görünümümdeki ViewModel'im için bir referansa ihtiyacım var, bu yüzden olay işleyicimden bir özellik ayarlayabilirim. Tek sorun, bu referansı alamam.MVVMLight - Görünümde ViewModel'e nasıl başvuru yapılır?

Ne yaptım;

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

Ve bir görünüm (XAML):

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

Ve bakış kod geride:

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

    public Tuner() 
    { 
     _viewModel = DataContext as TunerViewModel; 

     InitializeComponent(); 
    } 

Bir ViewModelLocator (silindi alakasız bit) sahip

DataContext'in bir ViewModel'e yerleştirildiği bu bağlantıyı MVVM View reference to ViewModel buldum; çünkü iyi bir çözüm gibi görünüyor. Ancak, _viewModel alanım yayınlandıktan sonra boş. Neden bu ve bunu nasıl düzeltirim? Eğer DataContext henüz ayarlanmamış View'in yapıcı bir bağlayıcı ifade ile XAML dan DataContext set Çünkü Google/Stackoverflow üzerinde önceden :)

+0

size App.xaml kaynaklarında Locator kurmak mı (alternatif veya ancak sayfası kaynakları gibi KURU değil)? Çünkü bu, XAML bağlayıcınızda görüntü modelini bulamıyor gibi görünüyor. – Robaticus

cevap

8

yılında

Teşekkür bulamadım. Bu yüzden sen boşaldın.

döküm veya Loaded olaydan sonra DataContext deneyin:

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

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

Ah, bu benim için çok aptalca. Teşekkürler! –

+0

Tam olarak, anahtar, InitializeComponent çağrıldıktan sonra VM'yi almaktır çünkü XAML'nin ayrıştırıldığı ve VM'nin talep üzerine oluşturulduğu yer burasıdır. Bu yüzden, kesinlikle konuşursak, Loaded olayına ihtiyacınız yoktur, sadece InviewizeComponent geri döndükten sonra _viewModel özniteliğinizi ayarlamanız gerekir :) – LBugnion

+0

@ LBugnion WP7'de değiştirilen davranış nedir? Çünkü WPF'de "DataContext" i XAML olarak ayarladığımda, 'InitializeComponent() 'çağrısından sonra bile usercontrol yapıcısında' null 'ise ... – nemesv