【问题标题】:WebView2 Interaction ViewModel (WPF/C#) --> RestrictDomainWebView2 交互视图模型 (WPF/C#) --> RestrictDomain
【发布时间】:2021-04-11 02:31:16
【问题描述】:

亲爱的网络大学,

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

Xaml:

<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 没有被重新定义,所以这只是另一个问题之上的另一个问题。(网络链接设置在其他地方)

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

感谢, 是我杰西

【问题讨论】:

    标签: wpf xaml binding viewmodel webview2


    【解决方案1】:

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

    如果要将视图中的属性/事件绑定到视图模型,则必须在视图/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"
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 2017-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多