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

时间:2015-03-08 03:53:43

标签: c# wpf xaml mvvm

我扫描了网,但一直无法找到答案。

我正在使用带有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");

}  

2 个答案:

答案 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最好留给垃圾收集器。