Управляйте событиями в командах и RX - PullRequest
4 голосов
/ 02 октября 2010

У нас есть несколько элементов управления WPF / Silverlight, которые мы написали с использованием традиционной архитектуры событий (без команд и т. Д.), И мы хотим преобразовать их в MVVM-совместимые. Я исследовал эту тему, и, насколько я понимаю, мне придется написать команды, чтобы обернуть события, которые у меня есть в элементе управления. Я хотел бы разработать его правильно сейчас, поэтому я хочу также подать жалобу RX, а не просто команды.

Может кто-нибудь объяснить мне, как я могу преобразовать мои в настоящее время разработанные события в команды и RX, пожалуйста.

Будет полезно, если мы возьмем что-то вроде события Click элемента управления и команды для него, а также RX-совместимого (наблюдаемого и т. Д.), Чтобы я мог понять, что в нем происходит.

В настоящее время это простые события, их довольно просто понять, чтобы работать с ними:) ... так что можно подписаться на них и выполнять собственные обработчики. Мой работодатель хочет, чтобы я делал эти команды, а также RX-ify.

Я прочитал несколько статей на эту тему, но нашел, что для этого требуется определенная степень доктора философии (математический дуал, предмет и т. Д.) :) Я не мог разобраться с этим. Я изо всех сил пытаюсь принять это и сделать это в командах, а также в RX. Пожалуйста помоги. Я хочу выучить это правильно, поэтому мне не нужно снова его переделывать.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 06 января 2011

Пол Д, Я думаю, что вы, возможно, просто принуждаете технологии ради технологий.

Сначала вы хотите использовать шаблон Command в WPF / SL, чтобы вы могли писать тестируемый код (MVVM). Это не зависит от Rx. Если ваша ViewModel построена правильно, то если вы решите использовать Rx где-то еще (репозиторий, модель, контроллеры и т. Д.), Тогда отлично.

Причина, по которой WPF использует команды вместо шаблона «Событие», заключается в том, что команда сообщает, что что-то должно произойти, когда событие транслирует, что что-то произошло. Когда вы пишете элемент управления, вы можете сообщить, что произошел щелчок, но в вашей ViewModel команда указывает, что что-то должно произойти.

Если мы посмотрим на пример:

a SubmitOrderCommand может инициировать вызов для передачи состояния модели в хранилище. Это само по себе не требует участия Rx. Однако процесс отправки может использовать Rx для публикации изменений состояния, например, «Отправка» -> «Отправлено» -> «CreditChecked» -> «Приняты».

Это может привести к тому, что некоторые контракты будут выглядеть следующим образом (код псевдо)

class OrderEntryViewModel
{
   public ICommand SubmitOrderCommand { get; }
}

interface IOrderRepository
{
   IObservable<OrderStatus> SubmitOrder(SubmitOrderRequest request);
}

Я согласен с вами, что вокруг Rx слишком много академий. Я рекомендую вам ознакомиться с моим блогом Введение в Rx . Надеюсь, это поможет вам быстрее понять Rx.
ОБНОВЛЕНИЕ: Взгляните на мою книгу IntroToRx.com . Он заменяет серию блогов.

0 голосов
/ 12 октября 2010

Я понятия не имею о ReactiveXaml, но если вы хотите связать события с командой, я мог бы посоветовать вам MVVM light. Вы можете попробовать что-то похожее на код ниже, более того, MVVM light поставляется с примером EventToCommand:

<Window 
   ... 
  xmlns:Interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
  xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras" 
  />
 <ComboBox ItemSource="{Binding MyCollection}">
    <Interactivity:Interaction.Triggers>
      <Interactivity:EventTrigger EventName="SelectionChanged">
         <cmd:EventToCommand Command="{Binding Path=LoadCommand}" />
      </Interactivity:EventTrigger>
    </Interactivity:Interaction.Triggers>
  </ComboBox>
...