WebView2 交互 ViewModel (WPF/C#) --> RestrictDomain

问题描述

亲爱的网络上的大学,

我想在我的应用程序中使用 WebView2,但是我想在我的视图模型文件中使用 RestrictDomain,该文件通常在 view.xaml.cs 文件中定义。这有可能以某种方式将它绑定到形状或形式吗?代码也不像:

XML:

<DockPanel>
    <wv2:WebView2
        x:Name="webView2Name"
        Source="{Binding weblink}"
        NavigationStarting="{Binding RestrictDomain}"
    />
</DockPanel>

视图模型:

    public string weblink { get; set; }

    public void RestrictDomain(object sender,CoreWebView2NavigationStartingEventArgs args)
    {
        string uri = args.Uri;
        if (!uri.StartsWith("https://www.google.com"))
        {
            args.Cancel = true;
            webView2Name.CoreWebView2.ExecuteScriptAsync($"alert('{uri} is outside of domain')");
        }
    }

viewmodel中的webView2Name当然没有被重新定义,所以这只是另一个问题之上的另一个问题。(网络链接设置在其他地方)

如果有人能找到或知道任何解决方案,将非常受欢迎。

您好, 是我杰西

解决方法

是的,您可以将 WebView2.Source 绑定到您的 ViewModel,并且应该可以将您的导航事件也绑定到您的 ViewModel。 Source 应该绑定到 Uri 类型(不是字符串)

如果要将视图中的属性/事件绑定到视图模型,则必须在视图/xaml 中定义数据上下文;像这样(假设您的命名空间是“YourNameSpace”,而您的视图模型类是“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>

注意:我在我的应用程序和您的视图/Xaml 中使用了 MVVMLight(nuget 包:MvvmLightLibs),您应该添加“:

xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Platform"

我希望这能对您有所帮助。祝你好运。