MvvmCross、Xamarin Studio 和 ICommands

Posted

技术标签:

【中文标题】MvvmCross、Xamarin Studio 和 ICommands【英文标题】:MvvmCross, Xamarin Studio and ICommands 【发布时间】:2013-07-01 14:32:26 【问题描述】:

我的问题诞生于Does MvvmCross work in Xamarin Studio?。 MvvmCross 在 Visual Studio 中运行良好。但是,我被要求使用他们的构建服务器使用的 Xamarin Studio 进行企业部署。在 Xamarin Studio 构建期间,我遇到了编译器找不到 System.Windows.Input.ICommand 的问题。 ICommands 似乎在整个 MvvmCross 中被广泛用于用户命令(MvxCommand,它实现了 System.Windows.Input.ICommand)。我尝试通过以下代码创建自己的 ICommand 版本:

using System;

namespace Something.Common

    public interface ICommand
    
        event EventHandler CanExecuteChanged;
        bool CanExecute(object parameter);
        void Execute(object parameter);
    

一切都好,但仍然没有修复 MvxCommand,因为它实现了接口 System.Windows.Input.ICommand。所以我创建了自己的版本,MvxCommandEx,它基本上是从 Stuart 的 MvxCommand 复制而来,并实现了我自己的 ICommand(Something.Common.ICommand)。

瞧,它会构建。它部署。这让我很兴奋。但是......它没有工作。我将 UI 元素绑定到我的自定义 ICommand 的任何地方都不会做任何事情。就好像从控件的 Click 事件到视图模型的命令的绑定不再存在,无论我将它绑定在 .axml 布局文件中......还是使用视图内置的 CreateBindingSet 方法。

现在...我可以解决一些问题...例如,如果我使用标准的 android 按钮,并从内置的 Click 事件手动调用视图模型的命令,例如:

btnAddScope.Click += (o, i) =>  _ViewModel.RequestAddScope.Execute(null); ;

它可以工作,在 Xamarin 发布他们的 PCL 支持之前,我可以暂时这样做。但是我在应用程序的另一部分中使用了 MvxListView,该部分使用以下语法以旧方式绑定:

lst.ItemClick = _ViewModel.RequestViewScope;

其中 lst 是一个 MvxListView。

但是,这不起作用,因为 lst.ItemClick 需要 System.Windows.Input.ICommand,而我的 ICommand 不在该命名空间中。

Stuart 对此提供了本应有效的解释。但是,我因为无法以实际可行的方式实现 ICommand 感到愚蠢,当它感觉它应该起作用时......所以在我走不同的途径来解决这个问题之前,我想看看是否有人可以阐明我做错了什么。

【问题讨论】:

【参考方案1】:

简单的解决方案是:

System.Windows.Input.ICommand 的 Xamarin 版本提供您自己的实现并使用此实现 或使用在 mac 上构建的 mvvmcross 二进制文件。

我推荐第一个。

如果您删除您的 Something.Common.ICommand 代码 abd,然后将您的 MyCommand 类实现与您的视图模型放在同一个项目/程序集中,那么它们应该在 Windows 和 Mac 上都能正常构建和运行。

【讨论】:

你能详细说明一下吗?我处于同样的情况,我必须提供自定义命令实现。我基本上已经将 MvxCommand 复制到了我的 ViewModel 项目中,对其进行了重命名并删除了接口,但是我无法使用它进行绑定。还有什么我需要做的吗? 好的,以上评论不再相关。我仍然无法绑定我的自定义命令,但是我已经成功更新到最新的 MvvmCross 版本(3.0.12),我现在可以愉快地使用 MvxCommand 构建(似乎没有更多的 ICommand 疯狂问题)

以上是关于MvvmCross、Xamarin Studio 和 ICommands的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.IOS中MvvmCross的plugin使用方式

错误 UWP 与 mvvmcross + xamarin 形式

Xamarin + MvvmCross + Azure 移动应用表请求不起作用

在 Xamarin.Android 中通过 MVVMCross 绑定 OxyPlot

TabbedPage 内的 xamarin mvvmcross TabbedPage

Xamarin Forms + Mvvmcross绑定命令不起作用