MVVM-Light定位器模式和可重用的UserControl

时间:2010-06-22 23:23:57

标签: user-controls mvvm-light

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

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

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

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

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

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

我是整个Silverlight和MVVM世界的新手,所以也许我错过了关于这一切应该如何构建或将自己画成角落的事情。我只是不确定。我当然欢迎任何建议。

1 个答案:

答案 0 :(得分:2)

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

使用INavigationContentLoader的一些示例是David Poll的Opening up Silverlight 4 Navigation: Introduction to INavigationContentLoader或Mike Taultry的Silverlight 4 Rough Notes: Taking Control of Navigation博客文章。这些帖子只展示了如何创建自己的内容加载器;使用它来重新加载现有视图取决于你。