Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface MvxCommand中间的UI操作_User Interface_Mvvmcross_Commandbinding - Fatal编程技术网

User interface MvxCommand中间的UI操作

User interface MvxCommand中间的UI操作,user-interface,mvvmcross,commandbinding,User Interface,Mvvmcross,Commandbinding,我正在使用MvvmCross,但这可能是常规命令绑定 当用户单击一个按钮时,应用程序需要一个额外的输入数据,然后才能继续在实际命令中执行我想要执行的操作。问题是我无法在ViewModel中间调用UI操作,因此仅绑定MvxCommand(或任何ICommand)将无法工作 人们可能会问为什么: 1) 我没有在UI上输入,用户可以在单击按钮->我没有空间之前输入数据。 2) 设置默认数据,让用户稍后更改->这是我的第一次更改,但用户以后往往会忘记更改 那么有人能想出一个解决办法吗?我能想到的唯一一件

我正在使用MvvmCross,但这可能是常规命令绑定

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

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

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


谢谢

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

我个人更喜欢的方式是使用“交互请求”——这是我从微软模式和实践的Prism框架中学到的

在Mvx中,您可以使用ViewModel上的
IMvxInteraction
属性来执行此操作。这方面的示例如所示

每次请求交互时,ViewModel都会向视图提供一个对象—在本例中为
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
属性公开请求者:

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);
                });
        }
    }
}
公共类问题视图模型
:MvxViewModel
{
私有MvxInteraction _confirm=new MvxInteraction();
公共IMVX交互确认
{
获取{return\u confirm;}
}
公共IMvxCommand GoCommand
{
得到
{
返回新的MvxCommand(()=>
{
var question=新的YesNoQuestion()
{
QuestionText=“现在关闭我?”,
YesAction=()=>关闭(此),
};
_确认。提出(问题);
});
}
}
}
然后,每个平台上的视图都可以绑定和订阅交互请求属性。这有点麻烦——因为它使用弱引用来防止内存泄漏——特别是在iOS上,但在其他平台上也可能

这方面的Droid代码示例如下:

  • 使用AXML
很抱歉这里混淆了
确认视图
问题视图
的名称-第一个是安卓
视图
,第二个是Mvvm
视图
和安卓
活动


另外,请注意,在Android中实现对话框时,您需要注意屏幕旋转-因为Android的活动生命周期可能会让这里的事情变得非常混乱-最简单的方法(我发现)是自己处理屏幕旋转,而不是让安卓来处理它。

我稍后会尝试,但这看起来像是我在寻找的答案。感谢您的示例,这是因为确认视图非常简单,所以在核心中没有相应的ViewModel吗?在我的例子中,用户必须从列表中选择一个项目(或单击“取消”)才能继续,因此我必须为“我的确认视图”创建一个ViewModel,是否可以使用Func而不是操作,以便我检索数据,而不只是知道用户采取了哪种操作?