在MVVMCross中,是否可以关闭视图模型并将值传递回导航堆栈中的先前视图模型?

Gab*_*eFC 5 c# mvvm mvvmcross xamarin

考虑以下示例。我有三个视图模型,ViewModel_AViewModel_B,和ViewModel_Values

我希望能够ViewModel_ValuesViewModel_A或导航到ViewModel_B,从中选择一个值ViewModel_Values,然后将该值返回到调用视图模型。

有没有一种方法可以将参数传递给导航堆栈中的先前视图模型,以便我可以简单地调用ViewModel_Values.Close(this),从而确保ViewModels_Values可以与任何其他视图模型分离,并且可以与任意“父”视图模型一起使用?

fma*_*oni 8

MvvmCross 5起

在MvvmCross 5中,您可以使用新版本IMvxNavigationService,使您的导航更加丰富。新功能之一是可以在导航到另一个ViewModel之后等待它的值,并且应该是在MvvmCross 5而非Messenger之后采用的方法,例如:

public class ViewModel_A : MvxViewModel
{
    private readonly IMvxNavigationService _navigationService;
    public ViewModel_A(IMvxNavigationService navigation)
    {
        _navigationService = navigationService;
    }

    public override async Task Initialize()
    {
        //Do heavy work and data loading here
    }

    public async Task SomeMethod()
    {
        var result = await _navigationService.Navigate<ViewModel_Values, MyObject, MyReturnObject>(new MyObject());
        //Do something with the result MyReturnObject that you get back
    }
}

public class ViewModel_Values : MvxViewModel<MyObject, MyReturnObject>
{
    private readonly IMvxNavigationService _navigationService;
    public ViewModel_Values(IMvxNavigationService navigation)
    {
        _navigationService = navigationService;
    }

    public override void Prepare(MyObject parameter)
    {
        //Do anything before navigating to the view
        //Save the parameter to a property if you want to use it later
    }

    public override async Task Initialize()
    {
        //Do heavy work and data loading here
    }

    public async Task SomeMethodToClose()
    {
        // here you returned the value
        await _navigationService.Close(this, new MyReturnObject());
    }
}
Run Code Online (Sandbox Code Playgroud)

更多信息在这里 HIH


Wic*_*edW 0

安装和使用 MvxMessenger 插件是在 MvvmCross 中解耦视图模型通信的好方法 -

对于您的情况,您可以设置一条新消息 -

public class ValuesChangedMessage : MvxMessage
{      
    public ValuesChangedMessage(object sender, int valuea, string valueb)
        : base(sender)
    {
        Valuea = valuea;
        Valueb = valueb;        
    }

    public int Valuea { get; private set; }
    public string Valueb { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

在 ViewModel_Values 中,您可以使用 - 来执行/发布您的 UX 更改 -

_mvxMessenger.Publish<ValuesChangedMessage>(new ValuesChangedMessage(this, 1, "boo!"));
Run Code Online (Sandbox Code Playgroud)

在 ViewModel_A、ViewModel_B 中,您将订阅它们并对其进行操作(因为当您从它们推送 ViewModel_Values 时,您的 ViewModel A / B 仍将位于导航堆栈中,因此它们可以接收消息)-

private MvxSubscriptionToken _messageToken;              

_messageToken = _mvxMessenger.Subscribe<ValuesChangedMessage>(async message =>
        {
            // use message.Valuea etc ..
        });
Run Code Online (Sandbox Code Playgroud)

更多信息在这里 -

https://www.mvvmcross.com/documentation/plugins/messenger?scroll=644 https://www.youtube.com/watch?feature=player_embedded&v=HQdvrWWzkIk