我扫描了网,但一直无法找到答案。
我正在使用带有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>
在viewmodel中,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视图和viewmodel?也就是说,虽然不再查看该字符,但我没有看到垃圾收集器调用Finalize来销毁该对象的位置。
我正在尝试立即释放与已删除的charactereditor关联的usercontrol和viewmodel中的资源 - 而不是等待垃圾收集器绕过它 - 如果它曾经这样做。
非常感谢任何帮助或想法。感谢。
编辑:使用它作为charactereditor的析构函数显示析构函数即使在从ItemsControl列表中删除后也没有被调用。
~CharacterEditorViewModel()
{
Console.WriteLine("Finalizing CharacterEditorViewModel object");
}
答案 0 :(得分:1)
我正在尝试立即从已删除的charactereditor关联的usercontrol和viewmodel中释放资源
我认为WPF不会实现 IDisposable ,因此应用程序需要自行清理。您可以使用Dispatcher_ShutdownStarted来释放资源。
查看http://geekswithblogs.net/cskardon/archive/2008/06/23/dispose-of-a-wpf-usercontrol-ish.aspx
答案 1 :(得分:1)
清理ViewModel是您的责任:
var ce = CharacterEditors[2];
CharacterEditors.RemoveAt(2);
ce.Dispose();
这也意味着您的VM应该实现IDisposable。不要添加析构函数(Finalizer)。
View最好留给垃圾收集器。