假设我有一个窗口,它在xaml中定义了一个datacontext
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
在代码中我打开了这个窗口,我希望使用read it datacontext来检索数据,如
MyWindow w = new MyWindow();
w.ShowDialog();
ViewModel vm = (ViewModel) w.DataContext;
这是危险的吗?我假设我的窗口可能在ShowDialog结束后受GC影响,这会导致w.DataContext
行在某些不幸的情况下失败。是否建议我在代码中设置datacontext以保持引用以防止GC? (当VM不需要特殊初始化时,我喜欢在xaml中指定VM,而View只使用该虚拟机的一个实例。此外,它还可以轻松找出视图使用的VM,并启用自动完成功能)
答案 0 :(得分:0)
只需在ShowDialog()
MyWindow w = new MyWindow();
ViewModel vm = (ViewModel) w.DataContext;
w.ShowDialog();
但实际上我能想到为什么它不起作用的唯一原因就是你有OnClosed
处理程序将DataContext
设置为null
。
此外,我假设您的ViewModel是class
而不是struct
。
答案 1 :(得分:-1)
你可以这样做,它会起作用,因为虽然窗口已经关闭,但它仍然是“活着的”#34;
但我建议采取另一种方式。您可以使用DesignInstance:
使用设计时智能mc:Ignorable="d"
d:DesignHeight="768" d:DesignWidth="1024"
d:DataContext="{d:DesignInstance IsDesignTimeCreatable=True, Type={x:Type local:ViewModel}}"
您应该在代码中设置运行时DataContext,如
MyWindow w = new MyWindow();
ViewModel vm = new ViewModel();
w.DataContext = vm;
w.ShowDialog();
// you can work with vm.
您只能通过这种方式确保DataContext是ViewModel。如果有人更改了xaml,并且DataContext不再是ViewModel,那么你的代码将无效。