1

亲爱的网络大学,

我想在我的应用程序中使用 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')");
        }
    }

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

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

伟大的,是我杰西

4

1 回答 1

0

是的,您可以将 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"

我希望这可以进一步帮助您。祝你好运。

于 2021-01-20T09:15:53.617 回答