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

时间:2015-07-20 11:10:10

标签: c# wpf mvvm methods controls

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

  1. TextBox的文本绑定到VM中的属性
  2. Button是绑定到中继命令的命令
  3. 当用户按下Button时,系统会调用网络浏览器的Navigate(url)方法,其中的网址为TextBox
  4. 中的文字

    以上是我想要创建的用例,但是使用 MVVM 设计模式可以实现1和2,但我找不到足够的方法来调用浏览器' s {{ 1}}方法。首先,是否可以从VM调用控件的方法(如果有办法请告诉我)?在上面的用例中,如果不可能,那么构建程序的适当方法是什么?

    由于

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

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

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

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

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

例如,如果您遇到绝对需要在UI控件上调用方法的情况,可以在ViewModel上连接events,然后在UI寄存器中连接对这个事件做了一些特定的UI ...

VM代码......

//... 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 NOT 应关注UI代码
  • 视图必须处理ViewModel提供的数据的显示。
  • 不要过度复杂化。 KISS ...