2010-10-02 74 views
4

我們使用傳統的事件架構(無命令等)編寫了一些WPF/Silverlight控件,並且希望將其轉換爲符合MVVM的WPF/Silverlight控件。我研究了這個問題,我認爲我必須編寫命令來包裝我目前掌握的事件。我想現在正確地設計它,所以我也想讓它成爲RX的投訴,而不僅僅是命令。將事件控制爲命令和RX

有人可以向我解釋我可以如何設計我目前設計的事件到命令和RX的請。

如果我們採取類似於控件的Click事件,設計命令以及RX兼容(可觀察等)的方式,這將非常有用,因此我可以理解所涉及的內容。

目前它是簡單的事件,它的工作原理非常簡單:)...所以可以訂閱它並執行自定義處理程序。 我的僱主要我做這個命令,並且還要RX-ify它。

我讀了一些關於這些的文章,但發現它需要一些博士學位才​​能理解(數學雙,主題<T>等:))我無法擺脫它。 我正在努力把這件事變成命令,並把它變成RX。請幫忙。我想正確地學習這一點,所以我不必再次重新設計它。

在此先感謝。

+1

我想結合ReactiveXaml的(http://blog.paulbetts.org/index.php/2010/06/15/reactivexaml-a-compelling-combination-of-mvvm-and-reactive-extensions-rx/) ReactiveCommand'和'Observable.FromEvent'會做你想做的事情,但你需要做一些實用工具類(例如標記擴展,附加行爲,附加屬性)來完成它。如果他看到這個問題,也許@保羅貝茨能夠提供一個很好的答案。 – 2010-10-02 19:17:11

回答

0

我不知道ReactiveXaml,但如果你想綁定事件命令,我可以建議你MVVM燈。您可以嘗試類似下面的代碼的東西,而且MVVM光具備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> 
+1

或者只是附加的命令行爲(https://marlongrech.wordpress.com/2008/12/13/attachedcommandbehavior-v2-aka-acb/),如果你不想使用完整的工具包。 – 2010-10-12 16:28:56

2

保羅·d, 。

首先您要在WPF/SL中使用命令模式,以便您可以編寫可測試代碼(MVVM)。這與Rx無關。如果你有你的ViewModel構造正確,那麼如果你選擇在其他地方使用Rx(Repository,Model,Controllers等),那麼很好。

WPF使用命令而不是事件模式的原因是因爲一個命令告訴發生什麼事情,作爲事件廣播發生了什麼事情。當你編寫一個控件時,你可以廣播一個點擊發生,但在你的ViewModel中,一個命令反映應該發生一些事情。

如果我們看一個例子:

一個SubmitOrderCommand可以發起呼叫提交模型的狀態到資源庫。這本身並不需要涉及Rx。然而,提交的進度可能會利用Rx發佈狀態更改,例如提交 - >提交 - > CreditChecked - >接受。

那麼這可能會導致一些合同看起來像這樣的(僞代碼)

class OrderEntryViewModel 
{ 
    public ICommand SubmitOrderCommand { get; } 
} 

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

我同意你的看法,有各地的Rx太多學術界。我建議您查看我的博客introduction to Rx。我希望它能幫助你更快地掌握Rx。我的書IntroToRx.com改爲:它取代了博客系列。