如何跟踪WebView2的链接变更?现有绑定方案失效
解决WebView2内部URL变更不更新ViewModel属性的问题
你的问题核心在于WebView2的Source绑定默认是单向的,且设置了UpdateSourceTrigger=Explicit后,只有手动调用绑定的UpdateSource()方法才会将目标(WebView2的Source)的值同步回源(ViewModel的MyHtml)。而WebView2内部导航变更URL时,不会自动触发这个同步操作,所以VM的set方法不会被调用。
下面是两种可行的解决方案:
方案1:使用双向绑定自动同步
将绑定模式改为TwoWay,并根据需求调整UpdateSourceTrigger(如果不需要手动触发,可以移除UpdateSourceTrigger=Explicit,默认Default模式会在目标属性变更时自动同步):
<WebView2 Source="{Binding MyHtml, Mode=TwoWay}" />
注意:ViewModel中的MyHtml属性建议声明为Uri类型(而非字符串),因为WebView2的Source属性本身是Uri类型,这样绑定无需额外转换器,同步更顺畅。示例VM属性:
private Uri _myHtml; public Uri MyHtml { get => _myHtml; set { if (_myHtml != value) { _myHtml = value; OnPropertyChanged(nameof(MyHtml)); } } }
方案2:手动监听导航事件同步
如果你需要保留单向绑定或更精细地控制同步时机,可以监听WebView2的NavigationCompleted事件,在事件回调中手动更新ViewModel的属性:
- 在XAML中注册事件:
<WebView2 Source="{Binding MyHtml}" NavigationCompleted="WebView2_NavigationCompleted" />
- 在View的代码后台实现事件处理:
private void WebView2_NavigationCompleted(object sender, CoreWebView2NavigationCompletedEventArgs e) { if (sender is WebView2 webView && DataContext is YourViewModel vm) { // 可选:仅当导航成功时更新,根据需求调整 if (e.IsSuccess) { vm.MyHtml = webView.Source; } } }
这种方式更灵活,比如可以过滤失败的导航、仅同步特定域名的URL等。
内容的提问来源于stack exchange,提问作者NightNickname
相关产品推荐
相关产品推荐

