MVVM卡住事件挂钩

时间:2015-11-24 16:21:28

标签: c# wpf xaml mvvm memory-leaks

我首先要说这是一个非常简单的例子,我的问题是在一个更大的项目中,所以虽然重构我所做的事情将是最好的方式,但它不是选项,我正在寻找可以添加到此示例中的内容,以便尽可能在底部解决问题。

我有2 viewmodelsPersonAddress)。

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正在构建模型,这是重要部分

这两个对象的视图是。

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视图在其上引入了Address视图模型,如果我将Person的2个实例添加到主窗口的列表中,则视图将创建2 Address的新实例,这是设计和伟大的。

我的问题是,如果您从集合中删除了一个Person实例,那么您将留下2个人和地址实例,其中一个由事件挂钩保存在内存中。

如果一个视图引入了一个视图模型并挂钩事件,你如何摆脱它们?

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:0)

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

另一个选择是查看弱事件模式,但我不熟悉它。