2012-08-14 81 views
0

我很难让TabControl在MVVM架构中完美运行。目前我所做的是将TabControl的ItemsSource属性绑定到ObservableCollection Screens属性。每次我想要添加新选项卡时,我都会创建足够的ViewModel,将其添加到屏幕,并通过适当的View来显示数据模板。TabControl和MVVM

问题:

1)似乎desctructor我的ViewModels不会被触发,直到完成应用程序关闭。我不确定数据模板是否是这个原因。当我从Screens集合中删除ViewModel时,它应该可用于GC,因为我所做的只是将其添加到Screens集合中,该集合显示了View,然后发出关闭视图的命令时,我从集合中删除了该集合。之后,我尝试强制Gc.Collect,但仍然只有在应用程序关闭时才会触发dctor。我不知道为什么会发生这种情况...

1)在某些数据结构中,不可能通过ElementName绑定到ViewModel的属性,所以一种方法是使用RelativeSource绑定。但是,当元素(ex View)被关闭时,会产生大量的绑定异常。类似的问题我的是这里描述:

How to avoid Binding Error when parent is removed

在我的情况TargetNullValue和FallbackValue没有帮助,并围绕我发现的唯一途径是让视图模型的静态资源。这种方法的问题是,使用屏幕采集和数据模板连接视图和的ViewModels时,您不能创建的ViewModels通常的方式:

<UserControl.Resources> 
    <vm:SomeViewModel x:Key="someViewModel" /> 
</UserCpntrol.Resources> 

那么,有没有一种替代方法在MVVM的情况下,或者我用的TabControl我在这里做错了什么?

回答

0

关于析构函数部分,不应该使用析构函数。相反,推荐使用IDisposable接口。这将帮助你自动的对象cleanupd并让GC为你做肮脏的工作:

使用此方法来关闭或释放非托管资源,如文件, 流,处理由一个实例举行该类实现了 这个接口。按照惯例,该方法用于与释放对象所拥有的资源相关联的所有任务 ,或准备重用的对象。

我最喜欢的MVVM教程使用Tabcontrol作为中央UI控件:WPF Apps With The Model-View-ViewModel Design Pattern。这可能会给你一个很好的工作方法提示。

+0

好吧,如果你看看你发布的例子,你可以看到作者也使用dctor用于测试目的,就像我一样。我们对Data模板使用的方法非常类似,区别在于他的dctor被触发,而我的不是。 :)虽然我正在使用Telerik控件,但我会用telerik ui尝试他的例子,看看dctor是否仍能正常工作。 – Goran 2012-08-15 00:16:35

+0

我现在已经测试了Joh与telerik TaBControl的例子,看来telerik控制有问题。既然你的文章给了我一个想法来测试这个,我会接受它作为答案。 – Goran 2012-08-15 13:00:05