将外观传递给 Xamarin Forms MVVM 中的 ViewModel?

Ala*_*an2 9 xamarin xamarin.forms

我有循环并执行等待和其他操作的业务逻辑。目前这是在后面的代码中。

据我所知,这是错误的地方,我应该将其放在 viewModel 中(如果错误请纠正我)。如果是这种情况,那么我的虚拟机中应该有一个 OnAppearing 方法吗?如果是的话,我应该如何将 OnAppearing 传递给视图模型?

目前我的页面 OnAppearing 看起来像这样:

    protected async override void OnAppearing()
    {
        base.OnAppearing();
        Title = Settings.mode.Text() + " Deck";
        vm.LearnViewVisible = Settings.mode.IsLearn();
        vm.PracticeViewVisible = Settings.mode.IsPractice();
        vm.QuizViewVisible = Settings.mode.IsQuiz();
        vm.QuizStartViewVisible = false;
Run Code Online (Sandbox Code Playgroud)

如果我要将大部分业务逻辑移至 ViewModel,那么这是否意味着所有这些都将移至我在 ViewModel 中创建的 OnAppearing() 方法?

Die*_*cio 15

另一种方法是使用David Britch 的Behaviors.Forms

    ...
    <ContentPage.Behaviors>
        <behaviors:EventHandlerBehavior EventName="Appearing">
            <behaviors:InvokeCommandAction Command="{Binding PageAppearingCommand}" />
        </behaviors:EventHandlerBehavior>
        <behaviors:EventHandlerBehavior EventName="Disappearing">
            <behaviors:InvokeCommandAction Command="{Binding PageDisappearingCommand}" />
        </behaviors:EventHandlerBehavior>
    </ContentPage.Behaviors>
    ...
Run Code Online (Sandbox Code Playgroud)

原来的

或者Xamarin 社区工具包 EventToCommandBehavior

    <ContentPage.Behaviors>
            <xct:EventToCommandBehavior
                EventName="Appearing"
                Command="{Binding PageAppearingCommand}" />
            <xct:EventToCommandBehavior
                EventName="Disappearing"
                Command="{Binding PageDisappearingCommand}" />
    </ContentPage.Behaviors>
Run Code Online (Sandbox Code Playgroud)

相关问题:EventHandlerBehavior 与 EventToCommandBehavior


val*_*asm -1

这是我的解决方案的示例

public partial class TaskDetailsPage : MvvmContentPage
{
    private readonly TaskDetailsViewModel _model;

    public TaskDetailsPage()
    {
        InitializeComponent();
        Shell.SetNavBarIsVisible(this, true);
        Shell.SetTabBarIsVisible(this, false);
        _model = BindingContext as TaskDetailsViewModel;
    }

    protected override string NavigationRoute => UniqeCodes.Routes.TaskDetailsPage;

    

    protected override void OnAppearing()
    {
        _model.Init();
    }
}

Run Code Online (Sandbox Code Playgroud)