我的Windows Phone 7应用程序中有一个使用Silverlight Map控件的页面(视图)。
我需要在控件上调用SetView方法,但我想坚持使用MVVM样式来保持视图模型中的功能。
我计划在点击应用程序栏按钮后调用此方法,因此我无法通过EventArgs参数访问Map。
最好的方法是什么?
答案 0 :(得分:1)
我自己没有使用地图控件,但是这里有一些想法:
您可以使用IEventAggregator发布一个事件,该视图可以订阅并用于调用SetView。
您可以实现一个自定义IResult,它使用ActionExecutionContext来获取视图,找到地图控件并在其上调用SetView。
您可以在视图模型上实现IViewAware(如果从Screen继承,则覆盖OnViewLoaded),并通过接口与视图交互调用SetView,遵循更多监督控制器方法。
答案 1 :(得分:0)
我通过在视图模型上使用MapLocation属性,然后在视图中连接到视图模型的PropertyChanged事件来完成此操作。当属性是MapLocation属性时,我只调用SetView并传入ViewModel的MapLocation属性的值。
我知道它不是“严格”的MVVM,但我们在这里讨论的是视图特定的,但不能被束缚。 Rob提出的事件聚合器方法是另一个不错的选择,但在这种情况下似乎有些过分。无论做得好还是为用户提供良好的表现,我都会为此做好准备:)
答案 2 :(得分:0)
我对这件事做了很多研究,这个问题很有帮助。最后,我最终在我的ViewModel上创建了一个Microsoft.Phone.Controls.Maps.Map属性。我所要做的就是将xaml中的x:Name属性设置为视图模型上Map的属性Name。然后我可以轻松地从视图模型更新地图,并调用SetView。您可以通过更改地图的这些属性轻松更改地图的中心并更改缩放级别,因此您只需要在初始化时调用SetView。我相信你可以使用类似的技术绑定任何东西。对于开箱即用的控件,Map控件非常棒,并且与Caliburn.Micro非常相配。