Привязать WebView2 к ViewModel с помощью Caliburn Micro
Я использую находящееся у нее руководство для справки: https://docs.microsoft.com/en-us/microsoft-edge/webview2/gettingstarted/wpf
Используя это руководство, я смог запустить WebView2 в моем приложении. Теперь я пытаюсь разделить код на ViewModel, поскольку на этой странице у меня будет гораздо больше элементов. Приложение в целом использует Caliburn Micro. Я могу привязать к ViewModel все, кроме самого WebView2. Когда я нажимаю кнопку "Перейти", отображается, что WebView имеет значение NULL. Я попытался вручную настроить WebView, но это не сработало.
BrowserView.xaml:
<Button
x:Name="ButtonGo"
Content="Go"
/>
<TextBox x:Name = "Addressbar"
/>
<wv2:WebView2 x:Name = "WebView"
Source="{Binding WebViewSource}"
/>
BrowserViewModel.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 продолжает возвращаться нулевым, и я не могу изменить страницу.
2 ответа
Как прокомментировал aepot, удаление свойства Webview и уведомление об изменении в источнике решило проблему. Теперь код для представления выглядит так:
<Button x:Name="ButtonGo"
Content="Go"/>
<TextBox x:Name = "Addressbar"/>
<wv2:WebView2 x:Name = "WebView"
Source="{Binding WebViewSource}"/>
А это для ViewModel:
public string Addressbar
{
get
{
return _addressbar;
}
set
{
_addressbar = value;
NotifyOfPropertyChange(() => Addressbar);
}
}
public void ButtonGo()
{
WebViewSource = Addressbar;
NotifyOfPropertyChange(() => WebViewSource);
}
Модель представления не должна содержать ссылку на такой элемент, как WebView2
. Это не MVVM и не то, как работает Caliburn.Micro. Модель представления определяет исходные свойства.
Если вы добавите TextBlock
свойство (не следует!) к модели представления, оно также всегда будет null
как и ваш WebView2
свойство есть, даже если вы добавите TextBlock
с соответствующим именем в разметке XAML.
Боюсь, это не имеет особого смысла как в отношении MVVM в целом, так и в отношении Caliburn.Micro в частности.