是的,您可以将 WebView2.Source 绑定到您的 ViewModel,并且应该可以将您的导航事件也绑定到您的 ViewModel。Source 应该绑定到 Uri 类型(不是字符串)
如果要将视图中的属性/事件绑定到视图模型,则必须在 view/xaml 中定义数据上下文;像这样的东西(假设你的命名空间是'YourNameSpace'并且你的viewmodel类是'ViewModel'):
<Window x:Class="YourNameSpace.View "
....
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:YourNameSpace"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
...
d:DataContext="{x:Type local:ViewModel}">
<Window.Resources>
此外,您的网络链接集应该引发一个事件,以通知视图的任何更改。通常,您的 ViewModel(或您的基类)会为此实现 INotifyPropertyChanged。
public class ViewModel: INotifyPropertyChanged
{
private Uri_webUri;
public Uri WebUri
{
get => _webUri;
set
{
_name = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(WebUri)));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
您在 XAML 中的绑定现在应该是:
Source="{Binding WebUri}"
最后一件事是将 NavigationStarting 事件连接到视图模型。我过去做过,但很挣扎,最后我为此使用了交互触发器。它有效,但也许有更好的解决方案。我用于 webview 事件的交互触发器是 'NavigationCompleted' ;所以也许你也可以使用它并将 NavigationCompleted 替换为 NavigationStarting。
<wv2:WebView2 Name="webView" Grid.Column="1" Source="{Binding WebUri}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="NavigationCompleted">
<cmd:EventToCommand Command="{Binding Mode=OneWay, Path=WebViewNavigationCompleted}"
PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</wv2:WebView2>
注意:我在我的应用程序和您的 View/Xaml 中使用了 MVVMLight(nuget 包:MvvmLightLibs),您应该添加“:
xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Platform"
我希望这可以进一步帮助您。祝你好运。