【发布时间】:2018-12-15 16:45:51
【问题描述】:
我试图将两个viewmodels 相互连接并最终使用static events。这是我得到的概述。
MainViewModelChildViewModel
我试图在 MainViewModel 构造函数中实例化 ChildViewModel
ChildViewModel childViewModel;
public MainWindowViewModel()
{
childViewModel = new ChildViewModel();
childViewModel.TextStatusChanged += ChildViewModel_TextStatusChanged;
}
但是,这种方法失败了,因为在此处创建的 ChildViewModel 实例以范围结尾结束,而且在其相关视图中创建的 ChildViewModel 实例与我在 @ 中创建的实例完全不同987654328@.
然后我将其更改为使用这样的静态事件
public MainWindowViewModel()
{
ChildWindowViewModel.TextStatusChanged += ChildViewModel_TextStatusChanged;
}
它的作用就像魅力,但在读了一点之后,我发现所有的人都说静态事件是不好的,因为它们可能会导致内存泄漏。
我可以使用哪些静态事件替代方案,或者如何附加相同的 viewmodel 实例来保存相同的事件。
【问题讨论】:
-
“以范围结尾” 听起来很奇怪。只要 MainWindowViewModel 实例包含对它的引用,它就应该存在。 “在其相关视图中创建的 ChildViewModel 实例” 表示编程错误。当您已经在后面的代码中创建了一个视图模型实例时,您不应该在视图中创建一个视图模型实例。相反,通过将 MainWindowViewModel 公开为属性来访问它,例如
public ChildViewModel ChildViewModel { get; } -
听起来MainViewModel应该有一个ChildViewModel的集合?当您创建每个孩子时,也许只是将其传递给 main?
-
@Clemens 感谢您的回复,我没有创建任何新实例,而是在其相关 xaml 中定义 ChildViewModel 会默认创建一个新实例,就我而言,我无法引用已经创建的实例来自 xaml 的 ChildViewModel
-
“在它的相关 xaml 中定义 ChildViewModel 会创建一个新实例” - 这正是你不应该做的。不要在 XAML 中定义 ChildViewModel。除此之外,我们无法告诉您如何访问 ChildViewModel,因为您还没有告诉我们有关您的应用程序的结构以及您的视图看起来如何的任何信息。
-
创建窗口时,将适当的子视图模型实例传递给它的 DataContext 属性。
标签: c# wpf events mvvm viewmodel