我很难让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我在这里做错了什么?
好吧,如果你看看你发布的例子,你可以看到作者也使用dctor用于测试目的,就像我一样。我们对Data模板使用的方法非常类似,区别在于他的dctor被触发,而我的不是。 :)虽然我正在使用Telerik控件,但我会用telerik ui尝试他的例子,看看dctor是否仍能正常工作。 – Goran 2012-08-15 00:16:35
我现在已经测试了Joh与telerik TaBControl的例子,看来telerik控制有问题。既然你的文章给了我一个想法来测试这个,我会接受它作为答案。 – Goran 2012-08-15 13:00:05