使用 Caliburn Micro 将 WebView2 绑定到 ViewModel



我正在使用指南找到她以供参考:https://learn.microsoft.com/en-us/microsoft-edge/webview2/gettingstarted/wpf

利用该指南,我能够在我的应用程序中启动 WebView2。现在我正在尝试将代码分离到 ViewModel 中,因为我将在该页面上提供更多元素。整个应用程序使用Caliburn Micro。我能够将所有内容绑定到 ViewModel,除了 WebView2 本身。当我选择"转到"按钮时,它指出 Web 视图为空。我尝试手动设置 WebView,但这不起作用。

BrowserView.xaml:

<Button 
x:Name="ButtonGo" 
Content="Go"
/>
<TextBox x:Name = "Addressbar"
/>
<wv2:WebView2 x:Name = "WebView"
Source="{Binding WebViewSource}"
/>

浏览器视图模型.cs

private WebView2 _webView;
public WebView2 WebView
{
get 
{
return _webView; 
}
set 
{
_webView = value;
NotifyOfPropertyChange(() => WebView);
}
}
public string WebViewSource { get; set; } = "http://Google.com";
private string _addressbar;
public string Addressbar
{
get 
{ 
return _addressbar; 
}
set 
{ 
_addressbar = value;
NotifyOfPropertyChange(() => Addressbar);
}
}

public void ButtonGo()
{
if (WebView != null && WebView.CoreWebView2 != null)
{
WebView.CoreWebView2.Navigate("https://bing.com");
}
}

无论我尝试什么,WebView 都会返回空值,并且我无法更改页面。

正如 aepot 所评论的那样,删除 Webview 属性并通知源代码中的更改解决了这个问题。视图的代码现在如下所示:

<Button x:Name="ButtonGo" 
Content="Go"/>
<TextBox x:Name = "Addressbar"/>
<wv2:WebView2 x:Name = "WebView"
Source="{Binding WebViewSource}"/>

对于视图模型,这是:

public string Addressbar
{
get
{
return _addressbar;
}
set
{
_addressbar = value;
NotifyOfPropertyChange(() => Addressbar);
}
}
public void ButtonGo()
{
WebViewSource = Addressbar;
NotifyOfPropertyChange(() => WebViewSource);
}

视图模型不应该保留对像WebView2这样的元素的引用。这不是MVVM,也不是Caliburn.Micro的工作方式。视图模型定义属性。

如果将TextBlock属性(不应添加!(添加到视图模型,则即使TextBlock在 XAML 标记中添加具有相应名称的,它也将始终像WebView2属性一样null

恐怕这没有多大意义,无论是关于MVVM,还是Caliburn.Micro。

相关内容

  • 没有找到相关文章

最新更新