在Caliburn Micro中维护视图状态的同时更改ActiveItem

时间:2013-10-30 22:01:43

标签: c# wpf mvvm caliburn.micro

我有一些ViewModels来自Screen对象,我从ShellViewModel派生了Conductor<T>.Collection.OneActive

如果我发出新的ActivateItem请求,例如:

ActivateItem(new AViewModel());

相关视图在我的ContentControl中处于有效状态,很棒。如果我再提出另一个请求:

ActivateItem(new BViewModel());

AViewModeldeactivatedBViewModelactive,但AViewModel也已关闭。

为防止ViewModel被关闭,我转而将已经实例化的实例传递给ActivateItem方法。 显示可以按照我的意愿工作。

我的问题是如何跟踪已创建的ViewModel,我并不总是想创建新实例。这是因为我希望保持View\ViewModel的状态,即使用户导航到另一个View只返回。我可以在我Collection的{​​{1}}中维护它们,也可以使用ShellViewModel中的Items Collection

其中哪一项是正确的,或者是否有更好的解决方案?

2 个答案:

答案 0 :(得分:0)

我不一定能说这是否是正确的方法,但是当我使用ViewModel Conductor<IScreen>.Collection.OneActive时出现类似情况时,我已经开始使用你的第一个建议了,已在ViewModels Conductor上保留了ViewModel的集合。

我发现它在概念上非常方便,因为它似乎与构建其他ViewModels时的构图想法一致。我发现自己偶尔预装某些ViewModels,假设他们可能希望稍后激活。我还使用了这样一个列表来跟踪从ViewModels集合中删除后关闭/删除的Items(尽管那是非常具体的,我不确定这是不是很好实践)。

对于大多数简单的情况,您可以使用Items集合执行此操作,并且可能根本不会遇到任何问题。

答案 1 :(得分:0)

我不会为此使用单独的集合,因为迟早会遇到同步问题(与线程无关),或者换句话说,您需要保留自定义集合并且Items集合彼此同步,添加更多,这将导致更多的混淆。

我肯定会使用Items集合,因为它就是出于此目的。