【发布时间】:2015-11-20 04:56:29
【问题描述】:
我正在尝试使用 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!
}
}
视图 get 已正确初始化,正在调用视图模型,并且两者可以绑定在一起。当我将视图模型的属性绑定到视图控件时,可以毫无问题地访问它。仅在初始化期间,视图的DataContext 始终为null。做什么?
MVVM 框架:Caliburn.Micro
【问题讨论】:
-
初始化后可以试试,可能是在用户控件的Loaded事件中?
-
首先检查
DataContext是否为空,因为您可能将DataContext转换为错误的类型。 -
在哪里以及如何为视图设置数据上下文?
-
OnInitialized 为时过早。稍后再做。不知道 caliburn 有什么推荐的,因为我不使用它。不知道您为什么要尝试从代码隐藏中操作虚拟机...这是一种代码气味,表明您尝试做的事情可能是错误的。最后一个提示——您可以使用 Dispatcher 安排稍后执行,例如在应用程序空闲后或数据绑定发生后。
-
@Will 你是对的,OnInitialized 在修复它的生命周期中太早了。您可以将此作为答案发布,以便我接受吗?哦,顺便说一句,我不操纵视图模型,我只需要视图模型已经为“视图”提供的一些数据,并且因为代码隐藏只是“视图”的“代码部分” ',除了数据绑定发生的事情之外,我没有做任何其他事情......只是在代码中,因为我正在做标记无法实现的特定于视图的检测。所以不,我不认为这是代码味道。 :)
标签: c# wpf mvvm data-binding caliburn.micro