我首先要说的是这是一个非常简单的例子,我的问题出在一个更大的项目中,所以虽然重组我正在做的事情是最好的方式,但这不是一种选择,但我正在寻找一些东西如果可能的话,我可以添加到这个例子来解决底部的问题。
我有 2 个 viewmodels
(Person
和 Address
)。
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 事件引入到可视化树中,您如何摆脱它们?
最佳答案
实现 IDisposable 并移除 OnModelChanged 的监听器,我不确定是否需要在两个类中实现 idisposable,并在 person 类中调用 dispose on address。但是您肯定必须删除地址 Dispose 方法中的监听器。
另一种选择是查看弱事件模式,但我对此不熟悉。
关于c# - MVVM 卡住事件 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33898736/