如何处理DataTemplate创建的用户控件

时间:2012-07-17 16:45:06

标签: wpf devexpress datatemplate

我必须在WPF中的两个视图之间切换。我有一个DataTemplate,它使用ViewModels根据ViewModel推断要绘制的视图。简而言之:

<DataTemplate DataType="{x:Type ..:RedScreenViewModel}">
<...:RedScreenViewModel/>
</DataTemplate>

一时兴起,我决定在视图之间快速切换..而且WPF应用程序的内存使用率高达2GB。现在你可能会争辩说,在现实生活中,没有人会做我做过的事情。但我想知道如何释放分配的内存。卸载肯定被称为,我已从任何事件处理程序取消订阅。 但它没有帮助。 DevExpress或WPF是否具有可以告诉.NET处理usercontrol的属性? 我找到了DevExpress,但是zilch是:

DisposeOnWindowClosing
DestroyOnClosingChildren

创建的视图非常复杂,我重新组织了布局以节省内存。但同样的增加。 建议非常感谢。

编辑: 然而,析构函数不会被调用...

1 个答案:

答案 0 :(得分:0)

这就是你如何处理嵌套在ItemsControl中的UserControl(在这种情况下:一个ListBox)

        public void Dispose()
        {
            if (this.listb != null)
            {
                for (int count = 0; count < this.listb.Items.Count; count++)
                {
                    DependencyObject container = this.listb.ItemContainerGenerator.ContainerFromIndex(count);
                    UserControl userControl = container.GetVisualDescendent<UserControl>();
                    IDisposable controlToPotentiallyDispose = userControl as IDisposable;
                    if (controlToPotentiallyDispose != null)
                        controlToPotentiallyDispose.Dispose();
                    controlToPotentiallyDispose = null;
                }
            }
            if (this.ViewModel != null)
            {
                this.ViewModel.Dispose();
                this.ViewModel = null;
            }
            this.listb = null;
        }

请注意,listb是用于查找项目的ListBox的名称。
此外,这个Dispose()方法应该在xaml.cs中,并且只要你不再需要视图就应该调用它。

HTH,

巴布。