我的问题出生在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,当它感觉它应该工作时...所以在我走另一条道路来解决这个问题之前,我想看看是否有人可以揭示我做错了什么。答案 0 :(得分:0)
简单的解决方案是:
System.Windows.Input.ICommand
的Xamarin版本提供您自己的实现并使用此实现我推荐第一个。
如果删除了Something.Common.ICommand代码abd,那么将MyCommand类实现放在与viewmodels相同的项目/程序集中,那么它们应该在windows和mac上构建并运行良好。