dim*_*boi 6 .net c# wpf reactiveui
我的应用程序使用实现IViewFor<T>
界面的视图.视图已在依赖项解析程序中注册AppBootstrapper
.应用程序ViewModelViewHost
通过为控件的ViewModel
属性分配相应的视图模型来使用控件显示视图.所有视图模型都实现了ISupportsActivation
接口.
我注意到它WhenActivated
被叫了两次.首先,当视图和视图模型被激活时调用它.然后在停用时,处理所有一次性用品并WhenActivated
立即再次调用,然后处理一次性用品.
我在视图和视图模型中使用以下代码进行测试:
this.WhenActivated(disposables =>
{
Debug.WriteLine("ViewModel activated.");
Disposable
.Create(() =>
{
Debug.WriteLine("ViewModel deactivated.");
})
.AddTo(disposables);
});
Run Code Online (Sandbox Code Playgroud)
结果输出如下:
// App displays the view:
ViewModel activated.
View activated.
// App hides the view:
ViewModel deactivated.
View deactivated.
ViewModel activated.
View activated.
ViewModel deactivated.
View deactivated.
Run Code Online (Sandbox Code Playgroud)
通过将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.
Run Code Online (Sandbox Code Playgroud)
WhenActivated
用于的调用SubView
返回一个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));
});
Run Code Online (Sandbox Code Playgroud)
对此:
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
});
Run Code Online (Sandbox Code Playgroud)
这样做的原因是,由于您的视图被销毁/处置,因此激活订阅本身也需要作为此过程的一部分进行处理.
归档时间: |
|
查看次数: |
853 次 |
最近记录: |