MVVMLight - как получить ссылку на ViewModel в представлении? - PullRequest
5 голосов
/ 20 марта 2012

Я создаю приложение для Windows Phone 7, и мне нужна ссылка на мою ViewModel в моем представлении, чтобы я мог установить свойство из моего обработчика событий. Единственная проблема в том, что я не могу получить эту ссылку.

Что я сделал;

У меня есть ViewModelLocator (удалены ненужные биты):

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

Я нашел эту ссылку MVVM Просмотр ссылки на ViewModel , где DataContext преобразуется в ViewModel, поэтому я попробовал то же самое, потому что это выглядит как хорошее решение. Тем не менее, мое поле _viewModel является нулевым после приведения. Почему это и как я могу это исправить? Я не смог найти его в Google / Stackoverflow

Заранее спасибо:)

1 Ответ

9 голосов
/ 20 марта 2012

Поскольку вы установили DataContext из XAML с выражением привязки в конструкторе представления, DataContext еще не установлен.Вот почему вы получаете ноль.

Попробуйте применить DataContext в или после события Loaded :

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

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