Пользовательская привязка mvvmcross к обработчику событий

Я пытаюсь реализовать функциональность LongClick в представлении и читаю следующее, в котором содержится некоторая информация mvvmcross touch привязка команд в android

Безуспешно искали IMvxCommand в коде, поэтому предположим, что он может быть устаревшим? Поэтому я сделал все возможное, но не смог получить какую-либо функциональность LongClick - вероятно, из-за ограниченного знания С# и обработчиков событий. Я реализовал следующее, но не был уверен в использовании MvxRelayCommand.

public class LongClickEventBinding: MvxBaseAndroidTargetBinding
{
private readonly View _view;
private MvxRelayCommand<JobJob> _command;

public LongClickEventBinding(View view)
{
    _view = view;
    _view.LongClick += ViewOnLongClick;
}

private void ViewOnLongClick(object sender, View.LongClickEventArgs eventArgs)
{
    if (_command != null)
    {
        _command.Execute();
    }
}

public override void SetValue(object value)
{
   _command = (MvxRelayCommand<JobJob>)value;
}

protected override void Dispose(bool isDisposing)
{
    if (isDisposing)
    {
        _view.LongClick -= ViewOnLongClick;
    }
    base.Dispose(isDisposing);
}

public override Type TargetType
{
   get { return typeof(MvxRelayCommand<JobJob>); }
}

public override MvxBindingMode DefaultMode
{
    get { return MvxBindingMode.OneWay; }
}
}

И

  protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
     {
     base.FillTargetFactories(registry);
     registry.RegisterFactory(new MvxCustomBindingFactory<View>("LongClick", view => new LongClickEventBinding(view)));
     }

И

  public ICommand JobSelectedCommand
     {
     get { return new MvxRelayCommand<JobJob>(NavigateToJobTasks); }
     }

  public void NavigateToJobTasks(JobJob jobJob)
     {
        RequestNavigate<JobTaskListViewModel>(new { key = jobJob.JobID });
     }

И

<Mvx.MvxBindableListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
local:MvxBind="{'ItemsSource':{'Path':'GroupedList'},'LongClick':{'Path':'JobSelectedCommand'}}"    
local:MvxItemTemplate="@layout/listitem_job_old"/>

Однако, когда я запускаю код на эмуляторе и кнопку мыши LongClick на элементе списка, мало что происходит. Необходимо ли реализовать следующее в представлении

public event EventHandler<View.LongClickEventArgs> LongClick;

Любая помощь / указатели приветствуются.


person Kern    schedule 17.02.2013    source источник


Ответы (1)


Что касается списков, vNext MvxBindableListView все равно какое-то время поддерживает ItemLongClick — см.

https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.Binding.Droid/Views/MvxBindableListView.cs#L77

Обратите внимание, что эта привязка подключается к ItemLongClick ListView, а не к LongClick.

Используя это в своем axml, вы сможете просто сделать:

<Mvx.MvxBindableListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
local:MvxBind="{'ItemsSource':{'Path':'GroupedList'},'ItemLongClick':{'Path':'JobSelectedCommand'}}"    
local:MvxItemTemplate="@layout/listitem_job_old"/>

Если это не сработает, отправьте отчет об ошибке в Github.


Если вы хотите выполнить свою пользовательскую привязку к универсальному (не списочному) представлению, тогда ваш код должен будет переключиться на ICommand вместо IMvxCommand, и вы также не сможете передать аргумент Item, поэтому вам нужно просто используйте MvxRelayCommand в ViewModel.

Я добавил поддержку LongClick на уровне просмотра в список задач — https://github.com/slodge/MvvmCross/issues/165

Но для ListView это, вероятно, ItemLongClick, который вас действительно интересует.

person Stuart    schedule 18.02.2013
comment
Работаем по инструкции. Спасибо. - person Kern; 19.02.2013