我正在尝试使用 MVVM 编程,我有以下用例:
TextBox
的文本绑定到VM中的属性Button
是绑定到中继命令的命令Button
时,系统会调用网络浏览器的Navigate(url)
方法,其中的网址为TextBox
以上是我想要创建的用例,但是使用 MVVM 设计模式可以实现1和2,但我找不到足够的方法来调用浏览器' s {{ 1}}方法。首先,是否可以从VM调用控件的方法(如果有办法请告诉我)?在上面的用例中,如果不可能,那么构建程序的适当方法是什么?
由于
答案 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)
或其他任何内容。
只要你遵守规则就应该是金色的: