C# 从itemscontrol中删除时如何强制销毁对象?

C# 从itemscontrol中删除时如何强制销毁对象?,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我浏览了一下网络,但找不到答案 我正在使用带有ItemsControl的MVVM模式来填充我的显示,如下所示: <ItemsControl ItemsSource="{Binding CharacterEditors}" > <ItemsControl.ItemsPanel> <ItemsPanelTemplate>

我浏览了一下网络,但找不到答案

我正在使用带有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>
但是,当charactereditor从ItemsControl中删除时,如何强制销毁该charactereditor视图和viewmodel?也就是说,虽然不再查看charactereditor,但我看不到垃圾收集器在哪里调用Finalize来销毁对象

我正在尝试立即从与已删除的charactereditor关联的usercontrol和viewmodel中释放资源,而不是等待垃圾回收器处理它(如果有)

非常感谢您的任何帮助或想法。谢谢

编辑:将其用作charactereditor的析构函数表明,即使已从ItemsControl列表中删除析构函数,也不会调用该析构函数

 ~CharacterEditorViewModel()   
       {
           Console.WriteLine("Finalizing CharacterEditorViewModel object");

}  
我正在尝试立即从与已删除的charactereditor关联的usercontrol和viewmodel中释放资源

我不认为WPF实现了IDisposable,所以应用程序需要自我清理。你可以做的是释放你的资源


查看一下

清理ViewModel是您的责任:

var ce = CharacterEditors[2];
CharacterEditors.RemoveAt(2);
ce.Dispose();
这也意味着您的VM应该实现IDisposable。不要添加析构函数(终结器)


该视图最好留给垃圾收集器

“我正在尝试立即释放资源[…],而不是等待垃圾收集器来处理”–为什么?如果
CharacterEditors
实现了
IDisposable
,那么在处理完它后只需调用
Dispose()
。请注意,如果调用
Dispose()
,则
IDisposable
的正确实现将抑制终结器(即不会调用它)。如果它没有实现
IDisposable
,那么为什么它要实现一个终结器,为什么您认为应该调用终结器?@poke每个charactereditor都有自己的inkcanvas和inkanalyzer以及相关提示和事件。其中一些(我认为??)被非托管代码所束缚。我希望确保在从itemscontrol显示的列表中删除charactereditor时释放这些资源。谢谢。@我想补充一下,inkcanvas在itemscontrol显示的usercontrol视图中被用作customcontrol。customcontrol的viewmodel不知道该视图(持有customcontrol)。处理viewmodel是否会破坏其视图???谢谢,这就是问题所在。这将是确切的答案,除了我没有试图关闭应用程序,只有一个(许多)用户控件。谢谢。但这里的问题是要释放的资源被保存在由xaml实例化的customcontrol中,而不是在viewmodel中。想法?我想我可能需要添加一个特殊事件,并让customcontrol侦听删除以释放其资源。还有更好的方法吗?一个(自定义)控件不应该保存资源。是你自己的吗?是的。Customcontrol源于InkCanvas,在创建Customcontrol时,我在InkCanvas中添加了一个InkAnalyzer……这似乎是正确的做法。有更好的办法吗?谢谢
 ~CharacterEditorViewModel()   
       {
           Console.WriteLine("Finalizing CharacterEditorViewModel object");

}  
var ce = CharacterEditors[2];
CharacterEditors.RemoveAt(2);
ce.Dispose();