我首先要说这是一个非常简单的例子,我的问题是在一个更大的项目中,所以虽然重构我所做的事情将是最好的方式,但它不是选项,我正在寻找可以添加到此示例中的内容,以便尽可能在底部解决问题。
我有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
正在构建模型,这是重要部分!
这两个对象的视图是。
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个人和地址实例,其中一个由事件挂钩保存在内存中。
如果一个视图引入了一个视图模型并挂钩事件,你如何摆脱它们?
答案 0 :(得分:0)
实现IDisposable并删除OnModelChanged的监听器,我不确定是否需要在两个类中实现idisposable,并在person类中调用dispose on address。但你肯定要删除地址Dispose方法中的监听器。
另一个选择是查看弱事件模式,但我不熟悉它。