微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – MVVM卡住事件钩子

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

我有2个viewmodels(人物和地址).

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)
    {
    }        
}

正如您所看到的,建筑上的地址正在与模型挂钩,这是重要的部分!

这两个对象的视图是.

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 viewmodel,如果我将2个Person实例添加到主窗口的列表中,该视图将创建2个新的Address实例,这是设计和很好的.

我的问题是,如果从集合中删除Person的一个实例,则会留下2个人和地址实例,一个由事件挂钩保存在内存中的实例.

如果视图模型已经通过视图引入可视树并挂钩事件,您如何摆脱它们?

enter image description here

enter image description here

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐