2012-11-24 6 views
7

Jeśli TL; DR: zobacz ostatni akapit.Rozdzielanie widoków, prezentacja poleceń (tekst, ikona) i logika komendy (wykonywanie, CanExecute)

Czysty WPF "sugeruje" umieszczenie prezentacji (kontrolek, tekstu, ikon) w widokach i logice poleceń (Execute, metody CanExecute) w kodzie źródłowym. Poza tym umieszczanie logiki w widokach (CommandBindings) i kodu źródłowego będącego marszczeniem brwi, nie pomaga w ogóle z powielaniem XAML: tekst, ikony, duże ikony, podpowiedzi i wiele innych właściwości muszą być zduplikowane za każdym razem, gdy jest używane polecenie: dla menu głównego, dla menu kontekstowego, dla przycisku paska narzędzi, dla przycisku wstążki i innych elementów sterujących.

Wygląda na to, że pierwszy problem (naprawdę rozdzielający widoki i logikę) jest rozwiązywany przez DelegateCommand, RelayCommand i podobne podejścia. Logika komend jest przenoszona do ViewModels (lub kontrolerów w przypadku MVVMC), kodowany z tyłu jest czysty, nie ma żadnego innego znaczenia w widokach.

Jednak nie mogę znaleźć powszechnie akceptowanego rozwiązania problemu z powielaniem prezentacji. Chcę oddzielić polecenia prezentacja (tekst, ikony) i polecenia logikę (Execute, CanExecute metody). Cały kod, jaki udało mi się znaleźć, umieszcza prezentację w kodzie (tworząc RoutedCommand z dodatkowymi właściwościami, takimi jak Label i Icon), lub umieszcza kod w prezentacji (to znaczy, obsługuje w widokach i z tyłu kodu). Ja też nie lubię. Myślę, że prezentacja powinna być całkowicie w XAML, a kod powinien być całkowicie w CS (albo w ViewModel lub Controller).

Pytanie: jak oddzielić poglądy (XAML z kontroli, które polecenia referencyjne), prezentacja poleceń (etykiet, ikony itp dla każdego polecenia) i logiką polecenia (kod C# dla Execute, CanExecute itp ViewModels lub Kontrolery)?

+0

Dwa blisko głosy już? I zero komentarzy? Czy to pytanie nie daje się rozwiązać, czy też coś przeoczyłem? Jeśli zagłosujesz na zamknięcie, zostaw co najmniej komentarz. Nie mogę się nauczyć, jeśli nie powiesz mi, co zrobiłem źle. – Athari

+0

Przeczytaj "nie konstruktywny" opis w FAQ - "to pytanie prawdopodobnie zachęci debatę, argumenty, sondowanie lub rozszerzoną dyskusję". Z tego samego powodu Stack Overflow nie jest dobrym miejscem do pytania "w jaki sposób powinienem zbudować moje oprogramowanie?" pytania. –

+2

@JeanHominal Sposób, w jaki to widzę, nie pytałam, jak zbudować MOJE oprogramowanie, zapytałam o problem, który moim zdaniem jest * bardzo powszechny *, biorąc pod uwagę, ile kodu widziałem, gdzie ten problem nie został rozwiązany , nawet w kodzie Microsoftu. A sądząc po głosowaniach (5 +1 głosów z 20 odsłon), nie jestem jedynym, który chce znaleźć rozwiązanie. – Athari

Odpowiedz

4

Nie ma wbudowanego rozwiązania tego problemu, konieczne będzie zwinięcie rękawów i samodzielne utworzenie wymaganej struktury.

W ostatnim projekcie, nad którym pracowałem, zrobiłem dokładnie to. Stworzyłem koncepcję o nazwie "akcja", która uzupełnia WPF ICommand z innymi właściwościami wizualnymi. To było coś takiego ...

interface IAction 
{ 
    ICommand Command { get; } 
    string DisplayText { get; } 
    string ToolTipText{ get; } 
    URI Icon { get; } 
} 

Wniosek zawierał zbiór Action przypadkach. Następnie można je powiązać z menu, paskami narzędzi itp., Umożliwiając ponowne użycie tej samej instancji Action w różnych stylach prezentacji. To wszystko jest dość proste rzeczy MVVM!

Powiązane problemy