我正在构建一个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上找到它
提前致谢:)
答案 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;
}