我正在使用MVVM模式在WPF中编写应用程序,其中我限制绑定到属性和命令exclusivley
但是,我想使用WebBrowser控件,它只能将内容的html字符串作为参数传递给mthod,而不是属性。
我打算创建一个从Webbrowser派生的具有必需属性的新控件,但是控件类是密封的。我尝试创建一个包装器控件,但我遇到了各种各样的依赖属性问题,这些问题似乎比我可能会遇到的问题更难解决。
有没有什么方法可以将参数(字符串)推送到MVVM的方法中,而不需要在代码隐藏文件中使用代码(这是一个很大的禁忌)。
由于
迪安
答案 0 :(得分:16)
为什么代码隐藏文件中的任何代码都是不是?我相信这是MVVM社区中最常见的误解之一。
MVVM不是消除背后代码的模式。它是将视图部分(外观,动画等)与逻辑部分(工作流)分开。此外,您还可以对逻辑部件进行单元测试。
我知道你必须编写代码的足够场景,因为数据绑定不是解决所有问题的方法。可以在此处找到使用代码并仍然实现MVVM分离的示例应用程序:
答案 1 :(得分:9)
答案 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
}