模型使用WebBrowser在WPF中查看ViewModel

时间:2009-02-23 16:32:10

标签: wpf mvvm browser

我正在使用MVVM模式在WPF中编写应用程序,其中我限制绑定到属性和命令exclusivley

但是,我想使用WebBrowser控件,它只能将内容的html字符串作为参数传递给mthod,而不是属性。

我打算创建一个从Webbrowser派生的具有必需属性的新控件,但是控件类是密封的。我尝试创建一个包装器控件,但我遇到了各种各样的依赖属性问题,这些问题似乎比我可能会遇到的问题更难解决。

有没有什么方法可以将参数(字符串)推送到MVVM的方法中,而不需要在代码隐藏文件中使用代码(这是一个很大的禁忌)。

由于

迪安

3 个答案:

答案 0 :(得分:16)

为什么代码隐藏文件中的任何代码都是不是?我相信这是MVVM社区中最常见的误解之一。

MVVM不是消除背后代码的模式。它是将视图部分(外观,动画等)与逻辑部分(工作流)分开。此外,您还可以对逻辑部件进行单元测试。

我知道你必须编写代码的足够场景,因为数据绑定不是解决所有问题的方法。可以在此处找到使用代码并仍然实现MVVM分离的示例应用程序:

WPF Application Framework (WAF)

答案 1 :(得分:9)

我使用了此处找到的解决方案

databind the Source property of the WebBrowser in WPF

HTH

答案 2 :(得分:6)

我不完全确定我理解这个问题(你想在WebBrowser上调用一个方法,但是需要一个html字符串才能这样做?)。

MVVM不是像瘟疫一样避免代码隐藏,而是关于将代码隐藏文件降级为严格的UI任务。

如果您将UI设置为包含典型的Address Bar + Go按钮,则需要使用Buttons的Click处理程序将字符串传递给浏览器。或者,字符串可以是ViewModel的属性,您可以通过将其绑定到WebBrowser的Tag属性来轻松地收集它。

您的用户界面大致如下所示:

<TextBox x:Name="addressBar" /> <!-- If you use the address bar -->
<Button Content="Go" Click="NavigateButton_Click" />
<WebBrowser x:Name="browser" Tag="{Binding URL}" />  <!-- If you bind to a VM property -->

您的代码隐藏可能如下所示:

void NavigateButton_Click(object sender, RoutedEventArgs e)
{
   browser.Navigate(new Uri(addressBar.Text)); // Address Bar
   browser.Navigate(new Uri(browser.Tag.ToString()); // Tag Binding
}