【发布时间】:2011-04-06 12:26:08
【问题描述】:
我想从 ViewModel 调用 AutoComepleteBox s PopulateComplete() 我怎么称呼它?
【问题讨论】:
标签: c# silverlight mvvm
我想从 ViewModel 调用 AutoComepleteBox s PopulateComplete() 我怎么称呼它?
【问题讨论】:
标签: c# silverlight mvvm
使用 System.Windows.Interactivity 的行为是实现此目的的好方法。
看看这个 - http://julmar.com/blog/mark/?p=34 - 在这种情况下,他将它用于水印,但你可以轻松地调整行为......我经常参考这篇博文作为起点。
关于行为的主要事情是,您可以访问无法在视图模型中附加的事件,这需要几分钟才能弄清楚,但有一天晚上在沙发上阅读一些博客和 MSDN,您将成为忠实粉丝!
【讨论】:
视图应该处理与用户界面和视图有关的所有事情——理想情况下,您应该从视图本身调用PopulateComplete()。根据您对 BrandonZeider 回答的评论,我建议您在 ViewModel 上创建一个事件,该事件在服务方法完成时触发,并将您的 PopulateComplete() 调用放入视图中该事件的处理程序中。
现在您可以在任何地方使用您的 ViewModel - 如果在服务调用完成时视图需要发生某些事情,它可以简单地订阅新事件。
【讨论】:
有几种不同的方法可以实现这一点,这取决于您尝试做什么...您尝试从 ViewModel 中的哪个位置调用 PopulateComplete()?例如,如果您在ICommand 的实例中,您可以将控件作为参数传入,对其进行强制转换并调用您的方法。
根据您的评论,我会以不同的方式处理这个问题。由于控件的限制,这将涉及一些解决方法。
在后面的代码中给视图添加一个事件监听器,监听你的视图模型中集合的集合改变事件。然后您可以在事件处理程序中调用 PopulateComplete()。您需要在您的视图中引用您的 ViewModel 才能使其正常工作。
另一种选择是在加载视图时(使用 EventTrigger)将对 AutoComepleteBox 的引用传递给 ViewModel,并将此引用存储在私有字段中。然后当您的 Web 服务调用返回时,使用此引用调用 PopulateComplete()。
【讨论】: