MVVMLight - 如何在View中获取对ViewModel的引用?

Leo*_*ens 5 silverlight mvvm windows-phone-7 mvvm-light

我正在构建一个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>(); }
}
Run Code Online (Sandbox Code Playgroud)

和视图(XAML):

DataContext="{Binding Tuner, Source={StaticResource Locator}}">
Run Code Online (Sandbox Code Playgroud)

和视图的代码隐藏:

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

    public Tuner()
    {
        _viewModel = DataContext as TunerViewModel;

        InitializeComponent();
    }
Run Code Online (Sandbox Code Playgroud)

我发现这个链接MVVM View对ViewModel的引用,其中DataContext被转换为ViewModel,所以我尝试了同样的,因为它看起来是一个很好的解决方案.但是,我的_viewModel字段在强制转换后为null.为什么这样,我该如何解决这个问题?我无法在Google/Stackoverflow上找到它

提前致谢 :)

nem*_*esv 9

因为您DataContext在View的构造函数中使用绑定表达式设置了XAML,DataContext所以尚未设置.这就是你得到null的原因.

尝试在Loaded事件DataContext中或之后进行强制转换:

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

private void OnTunerLoaded(object sender, RoutedEventArgs routedEventArgs)
{
    _viewModel = DataContext as TunerViewModel;
}
Run Code Online (Sandbox Code Playgroud)