c# - MVVM 卡住事件 Hook

标签 c# wpf xaml mvvm memory-leaks

我首先要说的是这是一个非常简单的例子,我的问题出在一个更大的项目中,所以虽然重组我正在做的事情是最好的方式,但这不是一种选择,但我正在寻找一些东西如果可能的话,我可以添加到这个例子来解决底部的问题。

我有 2 个 viewmodels(PersonAddress)。

Person.cs

public class Person : ViewModelBase
{
}

Address.cs

public class Address : ViewModelBase
{
    public Address() : base()
    {
       Model.OnModelChanged += Model_OnModelChanged;
    }

    private void Model_OnModelChanged(object sender, EventArgs e)
    {
    }        
}

如您所见,构建时的Address 挂接到模型中,这是重要的部分!

这两个对象的 View 是。

Person.xaml

<Style TargetType="{x:Type local:Person}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:Person}">
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="Person"/>
                    <local:Address/>
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Address.xaml

   <Style TargetType="{x:Type local:Address}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:Address}">
                    <TextBlock Text="Address"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Person View 自己引入了 Address View 模型,如果我将 2 个 Person 实例添加到主窗口的列表中,该 View 将创建 2 个新的 Address 实例,这是设计使然,非常棒。

我的问题是,如果您从集合中删除一个 Person 实例,您将留下 2 个 person 和 address 实例,一个由事件 Hook 保存在内存中。

如果 View 模型已通过 View 和 Hook 事件引入到可视化树中,您如何摆脱它们?

enter image description here

enter image description here

最佳答案

实现 IDisposable 并移除 OnModelChanged 的​​监听器,我不确定是否需要在两个类中实现 idisposable,并在 person 类中调用 dispose on address。但是您肯定必须删除地址 Dispose 方法中的监听器。

另一种选择是查看弱事件模式,但我对此不熟悉。

关于c# - MVVM 卡住事件 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33898736/

相关文章:

wpf - 如何为 UIElement.Margin 上的绑定(bind)设置 FallbackValue?

c# - 如何在分组项目页面中每组之前插入图像列表?

c# - 如何使用名为 "object"的变量名?

c# - 如何在 MVVM 模型中管理磁贴用户控件(具有列表框绑定(bind))?

c# - 有没有办法自定义 OpenFileDialog 来选择文件夹而不是文件?

wpf - 如何将此 WPF 示例进一步解耦为 MVC、MVP 或 MVVM?

wpf - 获取数据模板中的数据项

c# - 如何在 WPF 中动态添加多个内容到扩展器

c# - 操作失败,对具有 IID 的接口(interface)的 COM 组件上的 QueryInterface 调用失败,因为库未注册

c# - Windows 7 x32下C#中dllimport的问题