问题描述
亲爱的网络上的大学,
我想在我的应用程序中使用 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"
我希望这能对您有所帮助。祝你好运。