Gab*_*eFC 5 c# mvvm mvvmcross xamarin
考虑以下示例。我有三个视图模型,ViewModel_A,ViewModel_B,和ViewModel_Values。
我希望能够ViewModel_Values从ViewModel_A或导航到ViewModel_B,从中选择一个值ViewModel_Values,然后将该值返回到调用视图模型。
有没有一种方法可以将参数传递给导航堆栈中的先前视图模型,以便我可以简单地调用ViewModel_Values.Close(this),从而确保ViewModels_Values可以与任何其他视图模型分离,并且可以与任意“父”视图模型一起使用?
在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
安装和使用 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
| 归档时间: |
|
| 查看次数: |
3110 次 |
| 最近记录: |