是否可以在 Mvvmcross 中绑定 hiding/showing 一个 UIAlertController?

Is it possible to bind hiding/showing a UIAlertController in Mvvmcross?

我有一个与 API 交互的命令。如果该命令没有 return 想要的结果,它会设置一个名为 Error 的 ViewModel 属性。

我想将 Error 绑定到我的视图中的 UIAlertController 并在发生错误时显示它。

这就是我的大致情况(虽然显然可见性转换器不是可行的方法)。我应该补充一点,我知道应该使用 PresentViewController 来显示 UIAlertController。

        UIAlertController myAlert = UIAlertController.Create ("", Error.Text, UIAlertControllerStyle.Alert);
        set.Bind(myAlert).For("Visibility").To((myViewModel vm) => vm.Error).WithConversion("Visibility");

查看观察者设计模式。 我喜欢的实现方式很简单:

  1. 创建继承自 MvxMessage 的 class - 假设 ShowAlertDialogMessage 具有标题、内容等属性。
  2. 创建抽象 MessageObserver,其中 TMessage : MvxMessage class,例如:

    public interface IMessageObserver { void Subscribe(IMvxMessenger messenger); void Unsubscribe(); }

    public abstract class MessageObserver<TMessage> : IMessageObserver where TMessage : MvxMessage
    { 
       public void Subscribe(IMvxMessenger messenger) {
           messenger.SubscribeOnMainThread<TMessage>(OnMessageDelivered);
       }
    
       public abstract void OnMessageDelivered(TMessage message);
    }
    
  3. 创建 MessageObserverController

public class MessageObserverController { public void SubscribeObserver(IMessageObserver msgObserver) { msgObserver.Subscribe(messenger); } .. unsubscribe, dispose and so on goes here }

  1. 实施 ShowAlertDialogMessageObserver class(继承自 MessageObserver<ShowAlertDialogMessage>(),它显示 UIAlertViewController 以及来自 ShowAlertDialogMessage 的数据(标题、内容等) . 如果需要,将 root UIViewController 作为构造函数传递(无论如何,您将在视图控制器中注册 MessageObservers - 所以这不是问题)。

  2. 在您的 ViewController 中使用 MessageObserverController(最好创建基本视图控制器以简化操作)。

Voilà - 您将获得可重用的 UI 逻辑,您可以通过在 PCL ViewModel 中发布消息来引发该逻辑(无需创建任何 platform-specific 耦合!)。