mvvmcross 是否有用于 viewmodel 的内置消息以告知视图何时发生 ViewAppearing/Disappearing?

Does mvvmcross have a built-in message for viewmodel to tell view when ViewAppearing/Disappearing happen?

我有逻辑要在 Xamarin.Forms ContentView(不是页面)中执行,当它出现和消失时。这是一个 mvvmcross 内容视图:

public partial class MyContentView : MvxContentView

我希望这是一个普遍的需求,但我没有为此找到内置的 mvvmcross 方法调用或覆盖。有吗? [关于将这些添加到 Xamarin.Forms 本身进行了多年的讨论,但从未实施过。我希望 mvvmcross 为视图解决这个问题,就像他们为他们的视图模型所做的那样。]

注意:我知道有多种方法可以自己滚动;但这肯定是基本的;内置?


为完整起见,以下是我知道的替代方案:

所以有很多选择。我只是觉得我一定是忽略了一些东西,因为这似乎是一种普遍的、标准的、需要的。毕竟,每个平台都有自己的视图生命周期方法。而 mvvmcross 有相应的 viewmodel 生命周期方法。我只是想让跨平台 Xamarin.Forms 视图具有相同的生命周期方法 - 而无需发明我自己的解决方案。

不,我们不会在 ViewModel 更改时或生命周期更改时发布任何消息。

我们的 ViewModel 具有生命周期感知能力,您可以在其中覆盖 ViewModel 中的 OnViewAppeared、OnViewDisappeared 等。要完成这些工作,您需要使用 Activity/Fragment/ViewController 的 MvvmCross 变体,如果您将 ViewModel 分配给自定义控件,则需要自己调用这些方法。

到目前为止我找到的最简洁(对于 View)解决方案是在我的基础 MvxViewModel 中添加一个标准的 c# EventHandler。一个 属性 随着视图模型的出现和消失而切换。 属性 的 setter 调用事件处理程序。

视图模型:

public class BaseViewModel : MvxViewModel
{
    // ...
    
    public event EventHandler<BoolEventArgs> AppearingStateEvent;

    private bool _AppearingState;
    public bool AppearingState
    {
        get => _AppearingState;
        set
        {
            SetProperty(ref _AppearingState, value);
            AppearingStateEvent?.Invoke(this, new BoolEventArgs(value));
        }
    }

    public override void ViewAppearing()
    {
        base.ViewAppearing();
        AppearingState = true;
    }

    public override void ViewDisappearing()
    {
        AppearingState=false;
        base.ViewDisappearing();
    }
}

使用 class:

    public class BoolEventArgs : EventArgs
    {
        public bool Value;
        public BoolEventArgs(bool value)
        {
            Value = value;
        }
    }

查看:

public class BaseContentView : MvxContentView
{
    // ...
    
    protected override void OnBindingContextChanged()
    {
        base.OnBindingContextChanged();

        if (ViewModel is BaseViewModel vm)
        {
            // Remove old, in case we get here twice. Avoids duplicate events.
            vm.AppearingStateEvent -= Vm_AppearingStateEvent;
            vm.AppearingStateEvent += Vm_AppearingStateEvent;
        }
    }

    protected virtual void Vm_AppearingStateEvent(object sender, BoolEventArgs e)
    {
        bool appearingState = e.Value;
        // ...
    }
}

视图子classes 可以覆盖 Vm_AppearingStateEvent,以在视图出现或消失时执行操作。