【问题标题】:How to call UI Controls method from ViewModel(MVVM)?如何从 ViewModel(MVVM) 调用 UI Controls 方法?
【发布时间】:2011-04-06 12:26:08
【问题描述】:

我想从 ViewModel 调用 AutoComepleteBox s PopulateComplete() 我怎么称呼它?

【问题讨论】:

    标签: c# silverlight mvvm


    【解决方案1】:

    使用 System.Windows.Interactivity 的行为是实现此目的的好方法。

    看看这个 - http://julmar.com/blog/mark/?p=34 - 在这种情况下,他将它用于水印,但你可以轻松地调整行为......我经常参考这篇博文作为起点。

    关于行为的主要事情是,您可以访问无法在视图模型中附加的事件,这需要几分钟才能弄清楚,但有一天晚上在沙发上阅读一些博客和 MSDN,您将成为忠实粉丝!

    【讨论】:

    • +1 这个。行为非常酷......希望他们像 Silverlight 一样为 WPF 开箱即用。
    【解决方案2】:

    视图应该处理与用户界面和视图有关的所有事情——理想情况下,您应该从视图本身调用PopulateComplete()。根据您对 BrandonZeider 回答的评论,我建议您在 ViewModel 上创建一个事件,该事件在服务方法完成时触发,并将您的 PopulateComplete() 调用放入视图中该事件的处理程序中。

    现在您可以在任何地方使用您的 ViewModel - 如果在服务调用完成时视图需要发生某些事情,它可以简单地订阅新事件。

    【讨论】:

    • 这是我在极少数情况下需要 VM 回调视图的方法。只需在 VM 上公开一个事件,并允许 View 在需要时连接到它。
    【解决方案3】:

    有几种不同的方法可以实现这一点,这取决于您尝试做什么...您尝试从 ViewModel 中的哪个位置调用 PopulateComplete()?例如,如果您在ICommand 的实例中,您可以将控件作为参数传入,对其进行强制转换并调用您的方法。

    根据您的评论,我会以不同的方式处理这个问题。由于控件的限制,这将涉及一些解决方法。

    在后面的代码中给视图添加一个事件监听器,监听你的视图模型中集合的集合改变事件。然后您可以在事件处理程序中调用 PopulateComplete()。您需要在您的视图中引用您的 ViewModel 才能使其正常工作。

    另一种选择是在加载视图时(使用 EventTrigger)将对 AutoComepleteBox 的引用传递给 ViewModel,并将此引用存储在私有字段中。然后当您的 Web 服务调用返回时,使用此引用调用 PopulateComplete()。

    【讨论】:

    • 我有加载列表的服务方法和我绑定到自动完成框 ItemsSource 属性的列表。现在在加载每个项目列表后的服务方法中,我想调用 AutoCompeleteBox 的方法,它将从该列表中呈现下拉列表;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2020-02-24
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多