ViewModel 调用用户控件的方法(网络浏览器)

ViewModel calling a method of a user control (web browser)

我正在尝试在 MVVM 中编程,我有以下用例:

  1. TextBox 的文本绑定到虚拟机中的 属性
  2. A Button 是绑定到中继命令的命令
  3. 当用户按下 Button 时,网络浏览器的 Navigate(url) 方法被调用,URL 是 TextBox
  4. 中的文本

以上是我想创建的用例,但是 1 和 2 可以使用 MVVM 设计模式,但我找不到调用浏览器的 Navigate()方法。首先,是否可以从 VM 调用控件的方法(如果有办法请告诉我)?在上面的用例中,如果不可能的话,构建程序的合适方法是什么?

谢谢

您可以执行以下操作:

  • 将 属性 MyUrl 添加到您的 ViewModel
  • MyUrl 绑定到您的 WebBrower 的 Source 属性

确保 属性 实现 INotifyPropertyChanged。那么你的 Xaml:

<WebBrowser Source="{Binding MyUrl}" />

如果您真的想从 ViewModel 调用 UI 方法怎么办?

如果你曾经 运行 遇到绝对需要在 UI 控件上调用 方法 的情况,你可以连接events 在 ViewModel 上然后你的 UI 注册到这个事件并做一些 UI 特定的事情...

虚拟机代码...

//... some VM logic
EpicNavigateEvent(url) // raise event, allowing UI to handle how

在您视图的代码隐藏中(这是某些 MVVM 最纯粹的怪胎部分),您可以注册事件:

myVm.Navigate += doSomeNavigation;
...
public void doSomeNavigation(string url)
{
   // call Navigate
}

我已经成功地将这种方法用于我们具有单个 ViewModel 层和连接视图的多种技术(WinForms、WPF 和 Asp.Net)的应用程序。

如果您正在寻找更多优雅,请查看User Interaction Patterns on MSDN。 但概念是一样的:在 VM 上调用一些东西,View 会适当地处理它。

这种方法的常见场景是希望从 VM 向用户显示消息。您的 VM 应该引发一个事件说:ShowMyMessage("You're awesome"),然后您的 UI 会收到通知并处理它:MessageBox.Show(msg) 或其他任何内容。

只要你遵守规则,你就应该是金牌:

  • ViewModels 应该关注UI代码
  • 视图必须处理您的 ViewModel 提供的数据的呈现。
  • 不要把它复杂化。 KISS...