【问题标题】:mvvmcross IOS: How to callback from a ViewModel to a Viewmvvmcross IOS:如何从 ViewModel 回调到 View
【发布时间】:2014-06-06 16:25:10
【问题描述】:

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

问题是我不想使用信使发回字符串。我有我的理由,但基本上是因为 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);

最好的方法是什么?

【问题讨论】:

  • 我曾经工作过的一家主要的一级银行使用一个任务来包装新视图的逻辑来创造价值。考虑使用TaskCompletionSource&lt;Result&gt; 来结束在新视图中完成的工作。

标签: c# xamarin mvvmcross


【解决方案1】:

简而言之:我不知道“最好的方法”是什么。

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

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

要完美地实现任何东西,您确实应该添加序列化代码以确保这一切在所有平台上的“墓碑”期间都能正常工作......但这通常是矫枉过正 - 对于简单的数据收集对话框,用户通常不需要“完美” " 墓碑支持。

【讨论】:

  • 抱歉——作为一个答案有点啰嗦。我认为我最喜欢的是保管箱解决方案——但如果不写大量代码就很难解释——抱歉!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多