1

我有一个现有的 Silverlight 4 应用程序,我试图将其转换为使用定位器模式和 MVVM-Light 库。

我的理解是 MvvmLocator 类保留对每个视图模型的引用,并允许您将每个视图的 DataContext 绑定到定位器中的适当 ViewModel。

我的应用程序使用导航框架,因此应用程序中的每个页面都是加载到内容框架中的 UserControl。

我可以看到将每个页面视图绑定到定位器中的适当 ViewModel 是多么容易,但我的问题是我有其他 UserControls 具有自己的视图模型,这些视图模型可以在多个上下文中重复使用,如果每个实例都会导致问题控件的绑定到相同的最终视图模型实例。

例如,我有一个包含 2 个用户控件的搜索页面。第一个是搜索参数控件,其中包含几个相互依赖的组合框和一个搜索按钮。第二个是结果网格本身。包含这两个控件的页面的视图模型处理它们之间的通信。问题是这个搜索控件也会在其他页面上使用,并且让它们都使用相同的视图模型实例会导致各种令人头疼的问题。因此,使用普通的“DataContext={Binding ProductSearch, Source={StaticResource Locator}}”似乎是不可能的......

有没有其他人遇到过这个问题或有任何好主意如何解决它?我在想也许我可以修改定位器,为使用控件的每个页面创建一个新的视图模型实例。否则,我可以对每个页面转换强制进行清理,但是我将无法保存页面之间的状态。

我是整个 Silverlight 和 MVVM 世界的新手,所以也许我错过了关于这一切应该如何构建的一些东西,或者把自己画到了一个角落。我只是不确定。我绝对欢迎任何建议。

4

1 回答 1

2

您的主要问题是 Silverlight 导航框架总是在您导航到视图时创建一个新的视图实例。您可以使用 INavigationContentLoader 覆盖此行为并存储要重用的视图实例。

使用 INavigationContentLoader 的一些示例是 David Poll 的打开 Silverlight 4 导航:INavigationContentLoader 简介或 Mike Taultry 的Silverlight 4 粗略笔记:控制导航博客文章。这些帖子只展示了如何创建自己的内容加载器;使用它重新加载现有视图取决于您。

于 2010-06-23T17:12:40.177 回答