【问题标题】:How to control instantiation of View and ViewModel in Silverlight?如何在 Silverlight 中控制 View 和 ViewModel 的实例化?
【发布时间】:2011-07-12 03:36:17
【问题描述】:

我的 silverlight 应用程序有 2 个页面,PageA 和 PageB。每个页面都绑定到它对应的 ViewModel、PageAViewModel 和 PageBViewModel。 (我在 xaml 中将 ViewModel 设置为 View 的 DataContext。)

用户可以在这些页面之间来回切换,当用户在这些页面之间切换时,他们会创建 PageA 和 PageB 的新实例,这也会创建我不想要的 ViewModel 的新对象。我尝试将NavigationCacheMode 设置为Enable,现在所有视图仅在用户第一次导航到该页面时创建实例,这也意味着 ViewModel 只有一个实例。

我想知道如何控制 UI 只创建一个 View 实例并控制何时创建其 ViewModel 的新实例?

【问题讨论】:

  • 查看 Caliburn Micro。它提供了一个很好的方式来做 ViewModel first 或 View first presentation。
  • 我对您的问题感到有些困惑...您想知道一般情况下如何执行此操作,或者您应该为您的特定应用程序做什么?我问是因为您似乎已经实现了您的要求。
  • @slugster:我想知道如何控制要创建的实例(视图和视图模型)的数量。现在它每次导航到该页面时都会创建新实例并调用不好的服务器(打开页面 A,它会创建新实例并调用服务器 2 次。
  • 但是你说:现在所有的 Views 只在用户第一次导航到那个页面时创建实例,这也意味着 ViewModel 只有一个实例。 这没有达到你想要的吗?
  • @slugster:我只想创建一次 View 的实例,但我想控制如何创建 ViewModel 的实例,例如,PageAViewModel 每次在导航到时创建实例,但 PageBViewModel 只创建一次实例。 (我的英语不好,很抱歉让你感到困惑。)

标签: silverlight mvvm


【解决方案1】:

这就是像 Unity 一样的 IOC(控制反转)派上用场的地方。

您只需使用 Unity 将 ViewModel 注册为单例(只有一个,永远)。

与其在 View 中嵌入 ViewModel(像那样硬连线它们真的很糟糕),而是指定 View 在创建时需要什么 ViewModel 类型,并且匹配的 ViewModel 将被“注入” "进入视图。

基本 MVVM,没有其他一些注入框架,并没有给你太多开箱即用的东西(除了与视图分离)。

【讨论】:

    【解决方案2】:

    您是否尝试过为您的应用程序使用 MVVM 轻量级框架。它支持视图模型定位器概念,可避免每次用户单击页面时重新创建 VM 实例。看看 Laurent Bugnion here 的演讲。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 2011-04-09
      • 2015-07-01
      • 1970-01-01
      相关资源
      最近更新 更多