我很难让 TabControl 在 MVVM 架构中完美运行。目前我正在做的是将 TabControl 的 ItemsSource 属性绑定到 ObservableCollection Screens 属性。每次我想添加新选项卡时,我都会创建足够的 ViewModel,将其添加到 Screens,然后通过数据模板显示足够的 View。
问题:
1) 似乎我的 ViewModel 的析构函数在完整的应用程序关闭之前不会被触发。我不确定数据模板是否是造成这种情况的原因。当我从 Screens 集合中删除 ViewModel 时,它应该可用于 GC,因为我所做的只是将它添加到显示视图的 Screens 集合中,然后当发出关闭视图的命令时,我将其从集合中删除。之后我尝试强制 Gc.Collect,但 dctor 仍然只在应用程序关闭时触发。我不确定为什么会这样……
1) 在某些数据结构中,无法通过 ElementName 绑定到 ViewModel 的属性,因此一种解决方法是使用 RelativeSource 绑定。但是,当元素(例如视图)被关闭时,这会产生很多绑定异常。这里描述了与我的类似问题:
在我的情况下,TargetNullValue 和 FallbackValue 没有帮助,我发现的唯一方法是将 ViewModel 作为 StaticResource。这种方法的问题在于,当使用 Screens 集合和数据模板连接 Views 和 ViewModels 时,您不能以通常的方式创建 viewmodels:
<UserControl.Resources>
<vm:SomeViewModel x:Key="someViewModel" />
</UserCpntrol.Resources>
那么,是否有在 MVVM 场景中使用 TabControl 的替代方法,或者我在这里做错了什么?