2010-10-02 2 views
4

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

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

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

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

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

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

+1

Я думаю, что объединение ReactiveXaml's (http://blog.paulbetts.org/index.php/2010/06/15/reactivexaml-a-compelling-combination-of-mvvm-and-reactive-extensions-rx/) ' ReactiveCommand' и 'Observable.FromEvent' будут делать то, что вы хотите, но вам нужно будет сделать некоторые служебные классы (например, расширения разметки, привязанные поведения, прикрепленные свойства), чтобы сделать это. Возможно, @Paul Betts сможет дать хороший ответ, если он увидит этот вопрос. –

ответ

0

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

<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> 
+1

Или просто приложенное командование (https://marlongrech.wordpress.com/2008/12/13/attachedcommandbehavior-v2-aka-acb/), если вы не хотите использовать полный набор инструментов. –

2

Paul D, Я думаю, вы можете быть просто принуждая технологии ради технологий.

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

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

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

SubmitOrderCommand может инициировать вызов представить состояние модели в хранилище. Это само по себе не обязательно включать Rx. Тем не менее, прогресс в представлении может использовать Rx для публикации изменений состояния, например, Submitting -> Submitted -> CreditChecked -> Accepted.

тогда Это может привести к некоторым контрактам, которые выглядят так (псевдо код)

class OrderEntryViewModel 
{ 
    public ICommand SubmitOrderCommand { get; } 
} 

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

Я согласен с вами, что есть слишком много Academia вокруг Rx. Я повторяю, что вы просматриваете мой блог introduction to Rx. Надеюсь, это поможет вам быстрее схватить Rx.
UPDATE: Проверьте мою книгу IntroToRx.com. Он заменяет серию блога.

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