我有一个MvxViewController,在ViewDidLoad中我将按钮单击绑定到viewmodel。单击按钮时,我打开另一个视图,我需要将一个字符串返回到我的第一个视图
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");
}
问题是我不想使用信使发回字符串。我有我的理由,但基本上是因为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);
这样做的最佳方式是什么?
答案 0 :(得分:1)
简而言之:我不知道&#34;最好的方法是什么&#34;是
ChildViewModel-ParentViewModel消息的区域很复杂 - 特别是因为在使用Activity的Android平台和使用Pages的WindowsPhone等平台上,您无法保证在显示Child时ParentViewModel将在内存中。 (注意:这不是iOS上的一个问题,因为它的&#34; app暂停&#34;模型更简单)
当我确实需要一个ViewModel将数据返回给另一个时,那么:
我经常尝试将数据集合视图实现为&#34;弹出对话框&#34;而不是&#34;整页&#34; - 这使得父子ViewModel关系更加正确 - 并确保当子关闭时父ViewModel将在内存中。
我经常建议人们使用像Greg描述的基于Messenger的技术:http://www.gregshackles.com/2012/11/returning-results-from-view-models-in-mvvmcross/
我使用的另一个解决方案是:
IDropBoxService
和void Deposit(key, value)
bool TryCollect(key, out value)
单身人士
IVisible
功能ViewModel - 与https://github.com/MvvmCross/NPlus1DaysOfMvvmCross/blob/master/N-42-Lifecycles/Lifecycle.Core/ViewModels/FirstViewModel.cs#L10 IVisible
方法检查消息为了完美地实现任何目标,你真的应该添加序列化代码,以确保这一切都能在&#34; tombstoning&#34;在所有平台上...但通常这是过度的 - 对于简单的数据收集对话框,用户通常不需要&#34;完美&#34;墓碑支持。