c# - WPF View 模型 GC

标签 c# wpf mvvm memory-leaks garbage-collection

我有一个 ViewModel,它在从模型接收事件时,通过更新对话框的 ViewModel 并将其传递给对话框以进行数据绑定(bind),向用户显示一个对话框,即

public class MainViewModel
{
    ...
    private void OnModelRaisedEvent(object sender, EventArgs e)
    {
        DialogViewModel dialogViewModel = new DialogViewModel();
        Window dialog = new DialogView(dialogViewModel);
        dialog.ShowDialog();
    }
 }

在对话框的 View 中,我挂入一个按钮,单击以关闭窗口,即,

public class DialogView : Window
{
    public DialogView(DialogViewModel viewModel)
    {
        InitializeComponent();
        Loaded += (s,e) => {DataContext = viewModel; };
    }

    ...

    private void ButtonOnClick(object sender, RoutedEventArgs e)
    {
        Close();
    }
 }

因为只有 DialogView 使用 DialogViewModel,我能确信我不会在这里发生内存泄漏吗?

例如,如果我多次打开和关闭对话框,DialogViewModel 是否会在 DialogView 关闭时进行 GC,以免累积 DialogViewModel 的多个实例。在任务管理器中观察内存使用情况,多次打开和关闭 DialogView 时它确实会上升,但不确定这是否是因为 GC 尚未启动。

最佳答案

实际上您现在确实有依赖注入(inject),因为您是通过构造函数将 View 模型注入(inject)到对话框中。

当对话框 View 运行时,它包含对 MainViewModel 中的 dialogViewModel引用

当您关闭对话框时,控件返回给 OnModelRaisedEvent 方法,紧接着,该方法结束(dialog.ShowDialog() 之后没有其他代码) >) 并且 GC 收集变量 dialogViewModel,因为它的范围仅限于该方法。

因此,底线是:您应该能够毫无问题地使用您的代码。

关于c# - WPF View 模型 GC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30401114/

相关文章:

c# - Silverlight,如何制作UserControl列表(在ContentControl中?)

c# - 我正在寻找指向 cdb/windbg + .net 文档的链接

c# - 如何获取DataTable中某列的SqlType?

wpf - 在 'System.Windows.StaticResourceExtension' 上提供值引发异常

c# - 在列表框中选择标题时,在文本框中显示相应的内容。(MVVM WPF)

C#执行cmd命令不起作用

javascript - Vue.js:仅当路由参数发生变化时无法触发组件准备就绪

c# - 什么会导致 ListView 中的透明滚动条错误?

c# - 在我的 React 应用程序上实现 SignalR

wpf - 访问用户控件的子控件