MvvmCross,Xamarin Studio和ICommands

时间:2013-07-03 18:45:10

标签: xamarin mvvmcross icommand

我的问题出生在Does MvvmCross work in Xamarin Studio?。 MvvmCross在Visual Studio中运行良好。但是,我已经被要求使用Xamarin Studio进行整体部署,这是他们的构建服务器使用的。我遇到了在我的Xamarin Studio构建期间编译器找不到System.Windows.Input.ICommand的问题。在整个MvvmCross中,ICommands似乎被广泛用于用户命令(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不在该命名空间中。

斯图尔特为此提供了解释,据说应该有效。但是,我感到愚蠢的是因为无法以实际工作的方式实现ICommand,当它感觉它应该工作时...所以在我走另一条道路来解决这个问题之前,我想看看是否有人可以揭示我做错了什么。

1 个答案:

答案 0 :(得分:0)

简单的解决方案是:

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

我推荐第一个。

如果删除了Something.Common.ICommand代码abd,那么将MyCommand类实现放在与viewmodels相同的项目/程序集中,那么它们应该在windows和mac上构建并运行良好。