2017-08-07 97 views
6

Jest kilka przycisków na oknie i staram się znaleźć dobre podejście do obsługi poleceń.Prawidłowy sposób obsługi wielu poleceń (z przycisków) z Gjallarhorn

Na przykład:

muszę wykonać kilka czynności:

type Action = 
    |Show 
    |Open 
    |Input 
    |Change 
    |Statistic 

tłumaczenia to do XAML będą:

<Button Command="{Binding ShowCommand}" /> 
<Button Command="{Binding OpenCommand}" /> 
<Button Command="{Binding InputCommand}" /> 
<Button Command="{Binding ChangeCommand}" /> 
<Button Command="{Binding StatisticCommand}" /> 

nieco gry z biblioteki znalazłem dwa sposoby zrób to bez denerwującego gadania

1. Użyj Observable.merge

Binding.createMessage "StatisticCommand" Statistic source 
|> Observable.merge (Binding.createMessage "InputCommand" Input source) 
//|> Observable.merge ... and so on 
|> Observable.subscribe (performAction model.Value) 
|> source.AddDisposable 

2. Tworzenie uogólniać wiadomość

type GeneralMessage = 
    |Perform of Action 
    |Update of Message 

i wzbudzi wiadomość działania na wysokim poziomie

let mainComponent source (model : ISignal<Info>) = 

    let info = Binding.componentToView source "Info" infoComponent model 
    //... 

    let stat = Binding.createMessage "StatCommand" (Perform Statistic) source 
    let input = Binding.createMessage "InputCommand" (Perform Input) source 
    //let ... 

    [info; stat; input; ...] 

let appComponent = 
    let model = initInfo 
    let update message model = 
     match message with 
     |Update message -> 
      match message with 
      |... 
     |Perform action -> 
      performAction model action 
      model 

    Framework.basicApplication model update mainComponent 

(Dobrze, lubię pierwszą opcję, ponieważ te działania nie zmieniają modelu)

Czy to jest poprawny sposób (pierwszy, oczywisty) do zrobienia tych rzeczy lub biblioteka zawiera bardziej pasującą funkcję?

P.S. Szukałem Observable.concat [info; stat; input; ...], ale nie miałem szczęścia.

Odpowiedz

5

Więc albo opcja jest w porządku tutaj. Myślę, że to właściwe podejście zależy od tego, jak jest to stosowane, i jakie dane są wymagane:

  • Jeśli „Action” jest czymś, co powinno być obsługiwane przez komponent w całości, pierwsza opcja jest całkowicie prawidłowy. Włącza to działanie tego komponentu w ramach tej funkcji do ustawiania wiązania i całkowicie go wyklucza.

  • Jeśli "Akcja" wymaga czegoś poza modelem (lub dostępnym fragmentem modelu), propagowanie w górę, podobnie jak w Opcji 2, ma największy sens. Pozwala to modelowi pracować z akcją i odpowiednio go obsługiwać.