在MvxCommand中间的UI操作

时间:2014-03-25 15:54:44

标签: user-interface mvvmcross commandbinding

我正在使用MvvmCross,但这可能是一般的命令绑定。

当用户单击按钮时,应用程序需要额外的输入数据才能继续执行我想要在实际命令中执行的操作。我无法在ViewModel中调用UI操作的问题,因此仅绑定MvxCommand(或任何ICommand)将无法正常工作。

有人可能会问为什么: 1)我没有在UI上输入输入,用户可以在点击按钮之前输入数据 - >我没有空间。 2)制作默认数据,让用户稍后更改 - >这是我的第一次,但用户往往忘记稍后更改!!

那么有人可以提出解决方案吗?我唯一能想到的就是忘记命令绑定,然后让代码弹出ui以获取额外的数据,然后在视图模型中调用一个方法!

由于

1 个答案:

答案 0 :(得分:5)

有几种方法可以做到这一点。

我个人首选的方法是使用"互动请求" - 我从微软模式和实践中从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代码示例如下:

很抱歉这里有令人困惑的ConfirmationViewQuestionView个名字 - 第一个是Android View,第二个是Mvvm View和Android Activity

此外,请注意,在Android中实现Dialogs时,您需要注意屏幕旋转 - 因为Android的Activity生命周期可能会让这里的事情变得非常混乱 - 最简单的mecahnism(我发现)就是处理屏幕自己动手,而不是让Android处理它。