c# – 在ViewModelViewHost控件中托管的View和ViewModel中使用时
发布时间:2020-12-15 04:23:11 所属栏目:百科 来源:网络整理
导读:我的应用程序使用视图,这些视图实现了IViewFor T接口.视图已在AppBootstrapper中的依赖项解析程序中注册.应用程序通过为控件的ViewModel属性指定相应的视图模型,使用ViewModelViewHost控件显示视图.所有视图模型都实现了ISupportsActivation接口. 我注意到Wh
我的应用程序使用视图,这些视图实现了IViewFor< T>接口.视图已在AppBootstrapper中的依赖项解析程序中注册.应用程序通过为控件的ViewModel属性指定相应的视图模型,使用ViewModelViewHost控件显示视图.所有视图模型都实现了ISupportsActivation接口.
我注意到WhenActivated被调用了两次.首先,当视图和视图模型被激活时调用它.然后在停用时,丢弃所有一次性用品,然后立即再次调用WhenActivated,然后处理一次性用品. 我在视图和视图模型中使用以下代码进行测试: this.WhenActivated(disposables => { Debug.WriteLine("ViewModel activated."); Disposable .Create(() => { Debug.WriteLine("ViewModel deactivated."); }) .AddTo(disposables); }); 结果输出如下: // App displays the view: ViewModel activated. View activated. // App hides the view: ViewModel deactivated. View deactivated. ViewModel activated. View activated. ViewModel deactivated. View deactivated. 通过将ViewModelViewHost控件的ViewModel属性设置为null来隐藏视图. 难道我做错了什么? 编辑:这是完整的源代码:https://gist.github.com/dmakaroff/e7d84e06e0a48d7f5298eb6b7d6187d0 按第一个Show然后按Hide按钮将产生以下输出: SubViewModel activated. SubView activated. SubViewModel deactivated. SubView deactivated. SubViewModel activated. SubView activated. SubViewModel deactivated. SubView deactivated. 解决方法
SubView中使用的WhenActivated调用返回一个IDisposable对象,该对象可以在WhenActivated的同一调用中使用,以在停用时从激活事件中删除您的订阅.这样做可以防止二次激活和处理.
在SubView构造函数中,更改此: this.WhenActivated(d => { Debug.WriteLine("SubView activated."); d(Disposable.Create(() => { Debug.WriteLine("SubView deactivated."); })); d(this // ViewModel -> DataContext .WhenAnyValue(v => v.ViewModel) .BindTo(this,v => v.DataContext)); }); 对此: System.IDisposable whenActivatedSubscription = null; whenActivatedSubscription = this.WhenActivated(d => { Debug.WriteLine("SubView activated."); d(Disposable.Create(() => { Debug.WriteLine("SubView deactivated."); })); d(this // ViewModel -> DataContext .WhenAnyValue(v => v.ViewModel) .BindTo(this,v => v.DataContext)); d(whenActivatedSubscription); // <- Dispose of the activation subscription here }); 这样做的原因是,由于您的视图被销毁/处置,因此激活订阅本身也需要作为此过程的一部分进行处理. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |