加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – MVVM卡住事件钩子

发布时间:2020-12-15 20:56:53 所属栏目:百科 来源:网络整理
导读:我首先要说这是一个非常简单的例子,我的问题是在一个更大的项目中,所以虽然我正在做的重组将是最好的方式它不是一个选项,我正在寻找我可以添加的东西如果可能的话,在这个例子中解决底部的问题. 我有2个viewmodels(人物和地址). Person.cs public class Perso
我首先要说这是一个非常简单的例子,我的问题是在一个更大的项目中,所以虽然我正在做的重组将是最好的方式它不是一个选项,我正在寻找我可以添加的东西如果可能的话,在这个例子中解决底部的问题.

我有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方法中的监听器.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读