MvxCommand中间的UI操作

4
我正在使用MvvmCross,但是这可能是通用的命令绑定。
当用户单击按钮时,在执行实际命令之前,应用程序需要额外的输入数据。问题在于我不能在ViewModel中间调用UI操作,因此仅绑定MvxCommand(或任何ICommand)无法起作用。
有人可能会问为什么: 1)我不在UI上放一个输入框,让用户在单击按钮之前输入数据->我没有空间。 2)制作默认数据,让用户稍后更改它->这是我的第一个想法,但用户往往会忘记稍后更改它!
那么有人能想出解决方案吗?我唯一能想到的就是忘记命令绑定,让代码在后台弹出UI以获取额外的数据,然后调用ViewModel中的方法!
谢谢
1个回答

6
有几种方法可以实现这一点。
我个人偏爱使用“交互请求”——这是我从微软模式与实践的 Prism 框架中学到的东西。
在 Mvx 中,您可以使用 ViewModel 上的 IMvxInteraction 属性来实现。示例代码可在以下链接中找到:https://github.com/slodge/BindingTalk/blob/master/BindingTalk.Core/ViewModels/QuestionViewModel.cs 每次请求交互时,ViewModel 会向 View 提供一个对象——在本例中为 YesNoQuestion:
public class YesNoQuestion
{
    public Action YesAction { get; set; }
    public Action NoAction { get; set; }
    public string QuestionText { get; set; }

    public YesNoQuestion()
    {
        YesAction = () => { };
        NoAction = () => { };
    }
}

ViewModel通过一个IMvxInteraction<TQuestion>属性来暴露请求者:

public class QuestionViewModel
    : MvxViewModel
{
    private MvxInteraction<YesNoQuestion> _confirm = new MvxInteraction<YesNoQuestion>();
    public IMvxInteraction<YesNoQuestion> Confirm
    {
        get { return _confirm; }
    }

    public IMvxCommand GoCommand
    {
        get
        {
            return new MvxCommand(() =>
                {
                    var question = new YesNoQuestion()
                        {
                            QuestionText = "Close me now?",
                            YesAction = () => Close(this),
                        };
                    _confirm.Raise(question);
                });
        }
    }
}

然后,每个平台上的视图都可以绑定并订阅交互请求属性。这有点棘手 - 因为它使用弱引用来防止内存泄漏 - 尤其是在iOS上,但其他平台也有可能。

以下是一些示例Droid代码:

抱歉这里的`ConfirmationView`和`QuestionView`名称有点混淆 - 第一个是Android `View`,第二个是Mvvm `View`和Android`Activity`。

此外,请注意,在Android中实现对话框时,需要小心屏幕旋转 - 因为Android的Activity生命周期可能会让事情变得非常混乱 - 最简单的机制(我发现)就是自己处理屏幕旋转,而不是允许Android处理它。


我会稍后尝试,但这看起来像是我正在寻找的答案。谢谢。 - user2418216
在你的例子中,是因为ConfirmationView非常简单,所以它在核心中没有相应的ViewModel吗?在我的情况下,用户必须从列表中选择一个项目(或点击取消)才能继续,因此我必须为“我的确认视图”创建一个ViewModel。 - user2418216
能否使用 Func<TResult> 替代 Action,以便我可以检索数据而不仅仅知道用户执行了哪个操作? - user2418216

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接