MvvmCross, Xamarin Studio и ICommands

Моя проблема возникла в Работает ли MvvmCross в Xamarin Studio?. MvvmCross отлично работает в Visual Studio. Однако мне было поручено развернуть это корпоративно с помощью Xamarin Studio, который использует их сервер сборки. Я столкнулся с проблемой, когда System.Windows.Input.ICommand не был найден компилятором во время сборки Xamarin Studio. 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, которая в основном скопирована из MvxCommand Стюарта и реализует мою собственную ICommand (Something.Common.ICommand).

Вот и строит. Он развертывается. Меня это взволновало. Но.... не получилось. В любом месте, где я привязал элемент пользовательского интерфейса к своему пользовательскому 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 таким образом, который на самом деле работает, когда кажется, что он должен работать... поэтому, прежде чем я пойду другим путем, чтобы решить эту проблему, я хотел бы узнать, есть ли у кого-нибудь может пролить свет на то, что я делаю неправильно.


person Bryan Weidman    schedule 03.07.2013    source источник


Ответы (1)


Простые решения:

  • либо предоставить собственную реализацию для версии Xamarin System.Windows.Input.ICommand и использовать эту реализацию
  • или использовать двоичные файлы mvvmcross, созданные на Mac.

Я бы порекомендовал первый.

Если вы удалите свой код Something.Common.ICommand abd, а затем поместите реализацию класса MyCommand в тот же проект/сборку, что и ваши модели просмотра, тогда они должны нормально собираться и работать как в Windows, так и на Mac.

person Stuart    schedule 03.07.2013
comment
Вы можете остановиться на этом? Я нахожусь в той же ситуации, когда мне нужно предоставить собственную реализацию команды. Я в основном скопировал MvxCommand в свой проект ViewModel, переименовал его и удалил интерфейсы, однако я не могу получить привязку для работы с ним. Что-нибудь еще, что мне нужно сделать? - person Johannes Rudolph; 14.09.2013
comment
Хорошо, комментарий выше уже не актуален. Я до сих пор не могу связать свою пользовательскую команду, однако мне удалось успешно обновиться до последней версии MvvmCross (3.0.12), и теперь я могу с радостью строить с MvxCommand (похоже, больше нет проблем с безумием ICommand) - person Johannes Rudolph; 14.09.2013