如何从第三方控件中调用函数?

时间:2011-11-10 22:19:14

标签: silverlight mvvm

我在使用第三方软件(ESRI的Silverlight API)的Silverlight应用程序中实现MVVM模式。此第三方控件仅存在于XAML中:

<esri:Map x:Name="map" ... />

ViewModel有一个ObservableCollection对象,它绑定到ListBox。当用户双击某个特定项目时,Model(绑定到该ListBox中的用户控件)会触发一个&#34; Main&#34;视图模型已订阅。

我的问题是,在&#34; Main&#34; esri:Map所在的ViewModel,如何使用事件中的数据调用第三方控件中的函数(例如map.ZoomTo(result);)?到目前为止,我唯一的解决方案是将事件代码(在ListBox用户控件中)从ViewModel移动到Code-Behind,然后在&#34; MainPage&#34;中订阅这些事件。 xaml并触发代码背后的代码。

这是利用MVVM模式的最佳选择吗?

2 个答案:

答案 0 :(得分:1)

听起来您想要混合触发器或行为,具体取决于具体情况。 Here's an introduction to them.

答案 1 :(得分:0)

对于“ViewModel First”MVVM来说,这是一种非常有效的方法。另一种方法是使Code-Behind成为ViewModel Aware,并从事件处理程序直接调用View Model中的方法 - 这适用于MVVM的“View First”方法。

我非常喜欢将整个事情分开,并使用像Caliburn.Micro这样的MVVM框架。使用这样的框架,你可以通过使用MEF做更多的OOPish,非常SOLID,仍然是MVVM:

  1. 您的视图将简单地触发事件聚合器中的事件,其中消息有效负载包含任何接收器处理它的信息。 View不关心谁处理事件,它关心的是将事件提升到聚合器。

  2. 您的视图模型将处理适合每个事件的任何事件。他们不关心是谁引发了这一事件,只是他们负责处理来自聚合器的事件。

  3. 你会发现,直接ViewModel和MVVM的事件处理程序的第一次实现随着企业组合的增长而变得越来越繁琐:它的可扩展性有限。