Привязать 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 в частности.

Другие вопросы по тегам