视图的 DataContext 始终为 null
DataContext of view is always null
我正在尝试使用 DataContext
属性 在代码隐藏中访问视图的视图模型。但是,无论我在视图生命周期的什么时候尝试访问它,属性 总是 null
.
简单的虚拟设置:
// shell
internal class ShellViewModel : Conductor<IScreen>.Collection.OneActive
{
public ShellViewModel() {
ActivateItem(new MyTestViewModel());
}
}
// view code-behind
public partial class MyTestView : UserControl {
public MyTestView() {
InitializeComponent();
}
protected override void OnInitialized(EventArgs args) {
var vm = DataContext as MyTestViewModel;
Debug.Assert(vm != null); // is always null!
}
}
视图已正确初始化,正在调用视图模型,两者可以绑定在一起。当我将视图模型的 属性 绑定到视图控件时,可以毫无问题地访问它。只有在初始化的时候,视图的DataContext
总是null
。做什么?
MVVM 框架:Caliburn.Micro
public partial class MyTestView : UserControl {
public MyTestView() {
InitializeComponent();
}
public MyTestViewModel ViewModel() {
return (MyTestViewModel)Datacontext;
}
}
无论出于何种原因,这样做都会破坏模式背后的想法,因为不应将视图模型硬编码到视图中。可以理解用于测试目的,但用于任何实际使用;形式不佳。
-- 编辑 -- 我在考虑仅查看操作,但由于某种原因已经晚了,并且没有考虑从视图中访问数据而不是从 ViewModel 中访问视图。
这应该能满足您的需求。只有在框架将视图与视图模型绑定之后(即设置了数据上下文,一旦加载被命中)才会起作用。如果您需要事先做一些事情,我不确定还有什么更好的解决方案。
我正在尝试使用 DataContext
属性 在代码隐藏中访问视图的视图模型。但是,无论我在视图生命周期的什么时候尝试访问它,属性 总是 null
.
简单的虚拟设置:
// shell
internal class ShellViewModel : Conductor<IScreen>.Collection.OneActive
{
public ShellViewModel() {
ActivateItem(new MyTestViewModel());
}
}
// view code-behind
public partial class MyTestView : UserControl {
public MyTestView() {
InitializeComponent();
}
protected override void OnInitialized(EventArgs args) {
var vm = DataContext as MyTestViewModel;
Debug.Assert(vm != null); // is always null!
}
}
视图已正确初始化,正在调用视图模型,两者可以绑定在一起。当我将视图模型的 属性 绑定到视图控件时,可以毫无问题地访问它。只有在初始化的时候,视图的DataContext
总是null
。做什么?
MVVM 框架:Caliburn.Micro
public partial class MyTestView : UserControl {
public MyTestView() {
InitializeComponent();
}
public MyTestViewModel ViewModel() {
return (MyTestViewModel)Datacontext;
}
}
无论出于何种原因,这样做都会破坏模式背后的想法,因为不应将视图模型硬编码到视图中。可以理解用于测试目的,但用于任何实际使用;形式不佳。
-- 编辑 -- 我在考虑仅查看操作,但由于某种原因已经晚了,并且没有考虑从视图中访问数据而不是从 ViewModel 中访问视图。
这应该能满足您的需求。只有在框架将视图与视图模型绑定之后(即设置了数据上下文,一旦加载被命中)才会起作用。如果您需要事先做一些事情,我不确定还有什么更好的解决方案。