![](/img/trans.png)
[英]Xamarin.IOS : MVVMCross Passing parameter from view to ViewModel
[英]mvvmcross IOS: How to callback from a ViewModel to a View
我有一个MvxViewController,在ViewDidLoad中,将按钮单击绑定到视图模型。 单击按钮后,我打开另一个视图,在该视图中,我需要将字符串返回到我的第一个视图
public override void ViewDidLoad ()
{
var set = this.CreateBindingSet<MyView1, MyView1ViewModel>();
set.Bind(myButton).To(vm => vm.MyButtonCommand);
set.Apply();
}
public ICommand MyButtonCommand
{
get
{
_myButtonCommand = _myButtonCommand ?? new MvxCommand(MyButtonCommandClick);
return _myButtonCommand;
}
}
private void MyButtonCommandClick()
{
ShowViewModel<ViewModelNumber2>();
}
在第二个视图中运行了一些逻辑后,我想返回字符串
private void SomeMethodInViewModelNumber2()
{
//Raise event that will get pickup up in MyView
//Or somehow get "SomeString"
if (OnMyResult != null)
OnMyResult ("SomeString");
}
问题是我不想使用Messenger发送回字符串。 我有我的理由,但是基本上是因为ViewModelNumber2可以从许多不同的地方打开,并且工作原理略有不同,并且管理需要发送回的不同消息以及在何处订阅这些消息将是一团糟
有什么办法可以做下面的事情?
public override void ViewDidLoad ()
{
var set = this.CreateBindingSet<MyView1, MyView1ViewModel>();
set.Bind(myButton).To(vm => vm.MyButtonCommand).OnMyResult((myString) => {Process(myString)});
set.Apply();
}
或者也许当我创建ViewModelNumber2时,我应该将callBack传递给构造函数,并使用该回调将字符串从ViewModelNumber2发送回MyView1ViewModel。
ShowViewModel<ViewModelNumber2>(OnMyResult);
做这个的最好方式是什么?
简而言之:我不知道什么是“最好的方法”。
ChildViewModel-ParentViewModel消息的区域很复杂-尤其是因为在使用活动的Android和使用Pages的WindowsPhone的平台上,您无法保证在显示Child时ParentViewModel将在内存中。 (注意:这在iOS上不是问题,因为它的“应用暂停”模型更简单)
当我确实需要一个ViewModel返回数据到另一个时,则:
我经常尝试将数据收集视图实现为“弹出对话框”而不是“整个页面”,这使父子ViewModel关系更加正确-并确保当子项关闭时,父ViewModel将在内存中。
我经常建议人们使用像Greg所述的基于Messenger的技术, 网址为: http : //www.gregshackles.com/2012/11/returning-results-from-view-models-in-mvvmcross/
我使用的另一个解决方案是:
IDropBoxService
单例-使用API像void Deposit(key, value)
和bool TryCollect(key, out value)
IVisible
功能-如https://github.com/MvvmCross/NPlus1DaysOfMvvmCross/blob/master/N-42-Lifecycles/Lifecycle.Core/ViewModels/FirstViewModel.cs#L10 IVisible
方法检查消息 为了完美地实现任何功能,您确实应该添加序列化代码,以确保在所有平台上的“逻辑删除”过程中都能正常工作……但这通常是过大的-对于简单的数据收集对话框,用户通常不需要“完美”的逻辑删除支持。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.