2015-08-09 5 views
2

Я создаю пользовательский элемент управления Xamarin Forms, который содержит три кнопки (1,2,3) внутри представления. Давайте просто назовите это GaugeView ради этого примера. Вот как это в настоящее время установка:Xamarin Forms Event Bubbling и вызов операций на пользовательском рендерере

  • GuageView имеет пользовательский визуализатор на оба прошивке и Android под названием GuageViewRenderer.
  • GuageView раскрывает обработчики событий для Clicked1, Clicked2 и Clicked3.
  • GuageView предоставляет ICommand свойствам для Click1, Click2 и Click3.

Проблема заключается в том, что мне нужно убрать обработчики событий из пользовательского средства визуализации, потому что только одна команда управления платформой знает, когда была нажата одна из кнопок. Как вы можете пузырить события до GuageView, где живет общий код?

Я планировал связать команды и обработчики событий внутри пользовательского средства визуализации, но у меня с ним связано время, так как события могут быть запущены только из исходного класса (GuageView).

Есть ли лучший способ структурировать это? Главное, что я пытаюсь сделать, это разоблачить плагин native guage и подключить его кнопки, чтобы обработчики событий в общем коде (GuageView) получали пиктограммы события.

+0

Просто к сведению, я уже просмотрел Xamarin учебников по пользовательским рендерам, но не кажется, что буду что-нибудь о том, как общий код получает доступ к событиям, происходят родные, что является корнем моей проблемы. – Adam

ответ

3

Правильно, вы не можете создавать события за пределами класса, который их объявляет. Таким образом, вам нужно будет добавить метод к GaugeView, который поднимет события. Я также хотел бы, чтобы тот же метод вызывал и команды. Таким образом, в GaugeView

public void RaiseClick1() { 
    var clicked1 = Clicked1; 
    if (clicked1 != null) 
     clicked1(this, EventArgs.Empty); 

    if (Command1 != null && Command1.CanExecute(Command1Paramter)) 
     Command1.Execute(Command1Parameter); 
} 

Тогда в GaugeViewRender всякий раз, когда вам нужно уведомить мнение о том, что кнопка была нажата:

Element.RaiseClick1(); 
+0

Спасибо. Я как бы думал о том, чтобы разоблачить метод зажигания событий как публичный, но он просто чувствовал себя не так. Спасибо, что подтвердили мою озабоченность. :-) – Adam

+0

Мои свойства ICommand живут в GuageView, но фактическое выполнение команды должно быть привязано к собственному нажатию кнопки в рендерере, поэтому они привязаны к встроенному управлению платформой, не хочу ли я поднимать события Clicked, когда команда выполнена? – Adam

+0

'RaiseClicked' вызывает событие click и выполняет команду.Наличие кода команды в тех же местах означает, что вам не нужно повторять его в каждом встроенном рендерере. – shf301

-1

Поздний ответ, но, возможно, в будущем: Вы можете поднять событие одним нажатием кнопки извне, используя интерфейс IButtonController.

Класс Xamarin.Forms.Button реализует этот интерфейс, который обеспечивает один единственный метод: SendClicked

Отдавая свой Xamarin.Forms элемент в визуализатора (this.Element) к IButtonController Вы в состоянии вызвать этот метод и поднимите щелканье события Xamarin.Forms.Button.

Я также создал блог об этой теме: http://software.fauland.cc/?p=5637

+0

Почему понижение? – Alexander

 Смежные вопросы

  • Нет связанных вопросов^_^