【问题标题】:Change ActiveItem whilst maintaining view state in Caliburn Micro在 Caliburn Micro 中保持视图状态的同时更改 ActiveItem
【发布时间】:2013-10-30 22:01:42
【问题描述】:

我有许多从Screen 对象派生的ViewModels,我从Conductor<T>.Collection.OneActive 派生了我的ShellViewModel

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

ActivateItem(new AViewModel());

相关视图在我的ContentControl 中被激活,太好了。如果我再提出另一个请求:

ActivateItem(new BViewModel());

AViewModeldeactivatedBViewModelactive,但是,AViewModel 也被关闭了。

为了防止ViewModel 被关闭,我将已经实例化的实例传递给ActivateItem 方法。这似乎可以按我的意愿工作。

我的问题是如何跟踪已经创建的ViewModels,我并不总是想创建新实例。这样做的原因是我想保持View\ViewModel 的状态,即使用户导航到另一个View 只是为了返回。我可以在ShellViewModel 中的Collection 中维护它们,或者在Conductor 中使用Items Collection

以下哪一个是正确的(如果有的话),或者是否有更好的解决方案来解决我的问题?

【问题讨论】:

    标签: c# wpf mvvm caliburn.micro


    【解决方案1】:

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

    我肯定会使用 Items 集合,因为它就是为此目的而存在的。

    【讨论】:

    • 同步问题是一个很好的问题,我一直没有意识到这一点。
    【解决方案2】:

    我不一定说这是否是正确的方法,但是当我使用源自Conductor<IScreen>.Collection.OneActiveViewModel 遇到类似情况时,我已经开始使用您的第一个建议,并维护了一个集合ViewModels 上的 Conductor ViewModel

    我发现它在概念上非常方便,因为它似乎与构建其他 ViewModels 时出现的构图想法一致。我发现自己偶尔会预加载某些ViewModels,假设它们可能希望稍后被激活。在从Items 集合中删除之后,我还使用这样的列表来跟踪关闭/删除的ViewModels(尽管这是针对非常具体的事情,但我不确定这是否是一种好习惯)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多