关闭后使用窗口的datacontext会很危险吗?

时间:2016-09-13 14:16:56

标签: c# wpf xaml garbage-collection

假设我有一个窗口,它在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,并启用自动完成功能)

2 个答案:

答案 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,那么你的代码将无效。