mvvmcross IOS:如何从ViewModel回调到View

时间:2014-06-06 16:25:10

标签: c# xamarin mvvmcross

我有一个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);

这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

简而言之:我不知道&#34;最好的方法是什么&#34;是

ChildViewModel-ParentViewModel消息的区域很复杂 - 特别是因为在使用Activity的Android平台和使用Pages的WindowsPhone等平台上,您无法保证在显示Child时ParentViewModel将在内存中。 (注意:这不是iOS上的一个问题,因为它的&#34; app暂停&#34;模型更简单)

当我确实需要一个ViewModel将数据返回给另一个时,那么:

为了完美地实现任何目标,你真的应该添加序列化代码,以确保这一切都能在&#34; tombstoning&#34;在所有平台上...但通常这是过度的 - 对于简单的数据收集对话框,用户通常不需要&#34;完美&#34;墓碑支持。