gpt4 book ai didi

mvvmcross - MvxPropertyChangedListener 遇到的奇怪行为和解决方法

转载 作者:行者123 更新时间:2023-12-05 04:17:42 25 4
gpt4 key购买 nike

我是 MvvmCross 的新手,所以我可能只是做错了什么;还是不是。

以防万一,这也是一种解决方法,需要注意其他开发人员。

使用:Windows Phone 8

问题:在 View 页面中,使用 MvxPropertyChangedListener 订阅会工作一段时间,然后停止。

场景 ViewModel 有一个属性 IsBusy,出于特定原因我需要从后面的 View 页面代码 (.xaml.cs) 访问它。我认为它的工作方式是...

public LoadingView()
{
InitializeComponent();

// until loaded, we can not access viewmodel
Loaded += (sender, args) =>
{
var viewModel = (LoadingViewModel) ViewModel;

// add listener
new MvxPropertyChangedListener(viewModel).Listen(() => viewModel.IsBusy, () =>
{
// do something
});
};
}

现在,用户单击一个命令按钮,在该按钮上我使用 jsonRestClient 调用异步任务 rest 方法;任务完成后,isBusy 设置为 false;

注意:我还有 isBusy 绑定(bind)到 xaml 文件中的元素(到 progressBar 可见性)。

在 WP Emulator 中,单击按钮确实会引发监听器事件,但只会引发两到三次。之后,监听器中的代码不再执行。有趣的是,xaml 绑定(bind)仍在更新;

我不明白 GC 如何发挥作用;因为该属性在 ViewModel 本身中;

解决方法:没有太多时间调查这个问题;相反,我现在正在使用 IMvxMessenger,并从我后面的查看代码中订阅;到目前为止一切顺利,没有错误。

林蛙

最佳答案

MvvmCross 在其订阅中大量使用 weak 引用 - 例如对于 ViewModel 属性订阅和 Messenger 订阅之类的东西。

MvxPropertyChangedListener 的源代码在 https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross/ViewModels/MvxPropertyChangedListener.cs

此类订阅 View 模型更改使用:

_token = _notificationObject.WeakSubscribe(NotificationObjectOnPropertyChanged);

_token 存储在私有(private)成员变量中。

由于您的代码将属性监听器创建为临时对象,因此该对象将存在一小段时间,但随后会在系统确定的某个时刻被垃圾回收。当它被 GC 时,_token 也会如此 - 因此订阅本身将停止工作。

要解决此问题,请将属性监听器存储在 View 的一个字段中:

 _isBusyListener = new MvxPropertyChangedListener //....

这将阻止它被 GC

关于mvvmcross - MvxPropertyChangedListener 遇到的奇怪行为和解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21035436/

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