4

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

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

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

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

谢谢

院长

4

3 回答 3

18

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

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

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

WPF 应用程序框架 (WAF)

于 2009-10-02T18:28:23.177 回答
10

我使用了这里找到的解决方案

数据绑定 WPF 中 WebBrowser 的 Source 属性

高温高压

于 2009-04-08T10:38:17.270 回答
6

我不完全确定我理解这个问题(您想在 WebBrowser 上调用一个方法,但需要一个 html 字符串来执行此操作?)。

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

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

您的 UI 将大致如下所示:

<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
}
于 2009-02-23T16:56:03.553 回答