是否可以在 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");
查看观察者设计模式。
我喜欢的实现方式很简单:
- 创建继承自 MvxMessage 的 class - 假设 ShowAlertDialogMessage 具有标题、内容等属性。
创建抽象 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);
}
创建 MessageObserverController
public class MessageObserverController {
public void SubscribeObserver(IMessageObserver msgObserver) {
msgObserver.Subscribe(messenger);
}
.. unsubscribe, dispose and so on goes here
}
实施 ShowAlertDialogMessageObserver class(继承自 MessageObserver<ShowAlertDialogMessage>()
,它显示 UIAlertViewController 以及来自 ShowAlertDialogMessage 的数据(标题、内容等) . 如果需要,将 root UIViewController 作为构造函数传递(无论如何,您将在视图控制器中注册 MessageObservers - 所以这不是问题)。
在您的 ViewController 中使用 MessageObserverController
(最好创建基本视图控制器以简化操作)。
Voilà - 您将获得可重用的 UI 逻辑,您可以通过在 PCL ViewModel 中发布消息来引发该逻辑(无需创建任何 platform-specific 耦合!)。
我有一个与 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");
查看观察者设计模式。 我喜欢的实现方式很简单:
- 创建继承自 MvxMessage 的 class - 假设 ShowAlertDialogMessage 具有标题、内容等属性。
创建抽象 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); }
创建 MessageObserverController
public class MessageObserverController {
public void SubscribeObserver(IMessageObserver msgObserver) {
msgObserver.Subscribe(messenger);
}
.. unsubscribe, dispose and so on goes here
}
实施 ShowAlertDialogMessageObserver class(继承自
MessageObserver<ShowAlertDialogMessage>()
,它显示 UIAlertViewController 以及来自 ShowAlertDialogMessage 的数据(标题、内容等) . 如果需要,将 root UIViewController 作为构造函数传递(无论如何,您将在视图控制器中注册 MessageObservers - 所以这不是问题)。在您的 ViewController 中使用
MessageObserverController
(最好创建基本视图控制器以简化操作)。
Voilà - 您将获得可重用的 UI 逻辑,您可以通过在 PCL ViewModel 中发布消息来引发该逻辑(无需创建任何 platform-specific 耦合!)。