gpt4 book ai didi

c# - WhenActivated 在 ViewModelViewHost 控件中托管的 Views 和 ViewModel 中使用时被调用两次

转载 作者:太空狗 更新时间:2023-10-29 21:16:45 26 4
gpt4 key购买 nike

我的应用使用 View ,它实现了 IViewFor<T>界面。这些 View 已在 AppBootstrapper 中的依赖项解析器中注册.该应用程序使用 ViewModelViewHost 显示 View 通过将相应的 View 模型分配给控件的 ViewModel 来进行控制属性(property)。所有 View 模型都实现了 ISupportsActivation界面。

我注意到 WhenActivated被调用两次。首先,当 View 和 View 模型被激活时它被调用。然后在停用时处理所有一次性用品并且WhenActivated立即再次调用,然后处理一次性用品。

我正在 View 和 View 模型中使用以下代码进行测试:

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 来隐藏 View 。

我做错了什么吗?

编辑:这是完整的源代码:https://gist.github.com/dmakaroff/e7d84e06e0a48d7f5298eb6b7d6187d0

先按显示然后按隐藏按钮会产生以下输出:

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
});

此解决方案之所以有效,是因为您的 View 正在被销毁,因此激活本身也需要作为此过程的一部分进行处理。

关于c# - WhenActivated 在 ViewModelViewHost 控件中托管的 Views 和 ViewModel 中使用时被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36433709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com