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

时间:2012-03-20 15:14:44

标签: silverlight windows-phone-7 mvvm 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>(); }
}

和视图(XAML):

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

视图的代码隐藏:

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

    public Tuner()
    {
        _viewModel = DataContext as TunerViewModel;

        InitializeComponent();
    }

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

提前致谢:)

1 个答案:

答案 0 :(得分:9)

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

Loaded事件之后或之后尝试演员DataContext

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

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