0

我很难让 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 的替代方法,或者我在这里做错了什么?

4

1 回答 1

0

关于析构函数部分,不应该使用析构函数。这是实现IDisposable接口的推荐方法。这将帮助您自动清理对象并让 GC 为您完成脏活:

使用此方法关闭或释放实现此接口的类的实例所持有的非托管资源,例如文件、流和句柄。按照惯例,此方法用于与释放对象持有的资源或准备对象以供重用相关的所有任务。

我最喜欢的 MVVM 教程使用 Tabcontrol 作为中央 UI 控件:具有模型-视图-视图模型设计模式的 WPF 应用程序。这可能会为您提供一种不错且可行的方法的提示。

于 2012-08-14T21:13:31.887 回答