从项目控件中删除时如何强制销毁对象?
How to force object destruction when removed from an itemscontrol?
我上网查了一下,但一直找不到答案。
我使用带有 ItemsControl 的 MVVM 模式来填充我的显示:
<ItemsControl ItemsSource="{Binding CharacterEditors}" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding Path=CanvasLeft}" />
<Setter Property="Canvas.Top" Value="{Binding Path=CanvasTop}" />
<Setter Property="Canvas.Height" Value="{Binding Path=CanvasHeight}" />
<Setter Property="Canvas.Width" Value="{Binding Path=CanvasWidth}" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
在视图模型中,CharacterEditors 是:
private ObservableCollection<CharacterEditorViewModel> characterEditors;
public ObservableCollection<CharacterEditorViewModel> CharacterEditors
{
get
{
return characterEditors;
}
set
{
if (characterEditors != value)
{
characterEditors = value;
OnPropertyChanged("CharacterEditors");
}
}
}
每个 CharacterEditor 都有自己的视图和视图模型。
现在,我可以从列表中删除字符编辑器,因为
CharacterEditors.RemoveAt(2);
但是,当从 ItemsControl 中删除 CharacterEditor 时,如何强制销毁该 charactereditor 视图和视图模型?也就是说,尽管不再查看那个 charactereditor,但我看不到垃圾收集器在哪里调用 Finalize 来销毁对象。
我正在尝试立即从与已删除的角色编辑器相关联的用户控件和视图模型中释放资源——而不是等待垃圾收集器来处理它——如果它真的这样做了。
非常感谢任何帮助或想法。谢谢
编辑:使用它作为字符编辑器的析构函数表明即使从 ItemsControl 列表中删除析构函数也不会被调用。
~CharacterEditorViewModel()
{
Console.WriteLine("Finalizing CharacterEditorViewModel object");
}
I am trying to immediately free-up resources from the usercontrol and viewmodel associated with the charactereditor that was removed
我认为 WPF 没有实现 IDisposable,因此应用程序需要清理 itself.What 您可以使用 Dispatcher_ShutdownStarted 来释放资源。
看看http://geekswithblogs.net/cskardon/archive/2008/06/23/dispose-of-a-wpf-usercontrol-ish.aspx
清理 ViewModel 是您的责任:
var ce = CharacterEditors[2];
CharacterEditors.RemoveAt(2);
ce.Dispose();
这也意味着您的 VM 应该实现 IDisposable。不要添加析构函数(Finalizer)。
视图最好留给垃圾收集器。
我上网查了一下,但一直找不到答案。
我使用带有 ItemsControl 的 MVVM 模式来填充我的显示:
<ItemsControl ItemsSource="{Binding CharacterEditors}" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding Path=CanvasLeft}" />
<Setter Property="Canvas.Top" Value="{Binding Path=CanvasTop}" />
<Setter Property="Canvas.Height" Value="{Binding Path=CanvasHeight}" />
<Setter Property="Canvas.Width" Value="{Binding Path=CanvasWidth}" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
在视图模型中,CharacterEditors 是:
private ObservableCollection<CharacterEditorViewModel> characterEditors;
public ObservableCollection<CharacterEditorViewModel> CharacterEditors
{
get
{
return characterEditors;
}
set
{
if (characterEditors != value)
{
characterEditors = value;
OnPropertyChanged("CharacterEditors");
}
}
}
每个 CharacterEditor 都有自己的视图和视图模型。
现在,我可以从列表中删除字符编辑器,因为
CharacterEditors.RemoveAt(2);
但是,当从 ItemsControl 中删除 CharacterEditor 时,如何强制销毁该 charactereditor 视图和视图模型?也就是说,尽管不再查看那个 charactereditor,但我看不到垃圾收集器在哪里调用 Finalize 来销毁对象。
我正在尝试立即从与已删除的角色编辑器相关联的用户控件和视图模型中释放资源——而不是等待垃圾收集器来处理它——如果它真的这样做了。
非常感谢任何帮助或想法。谢谢
编辑:使用它作为字符编辑器的析构函数表明即使从 ItemsControl 列表中删除析构函数也不会被调用。
~CharacterEditorViewModel()
{
Console.WriteLine("Finalizing CharacterEditorViewModel object");
}
I am trying to immediately free-up resources from the usercontrol and viewmodel associated with the charactereditor that was removed
我认为 WPF 没有实现 IDisposable,因此应用程序需要清理 itself.What 您可以使用 Dispatcher_ShutdownStarted 来释放资源。
看看http://geekswithblogs.net/cskardon/archive/2008/06/23/dispose-of-a-wpf-usercontrol-ish.aspx
清理 ViewModel 是您的责任:
var ce = CharacterEditors[2];
CharacterEditors.RemoveAt(2);
ce.Dispose();
这也意味着您的 VM 应该实现 IDisposable。不要添加析构函数(Finalizer)。
视图最好留给垃圾收集器。