2009-10-09 9 views
5

Buduję prostą aplikację do wprowadzania danych w formularzu WPF, używając wzorca MVVM. Każdy formularz ma obiekt prezentujący, który eksponuje wszystkie dane itp. Chciałbym użyć poleceń WPF do włączania i wyłączania przycisków Edit/Save/Delete i opcji menu.Polecenia WPF - Robiąc to bez kodu źródłowego

Mój problem polega na tym, że to podejście wymaga ode mnie dodania dużej ilości kodu do kodu źródłowego. Staram się, aby warstwa prezentacji była jak najcieńsza, więc wolałbym, aby ten kod/logika znajdowała się w mojej klasie prezentera (lub ViewModel), a nie w kodzie. Czy ktoś może zaproponować sposób na osiągnięcie tego samego bez kodem?

Moje XAML wygląda trochę tak:

<Window.CommandBindings> 
    <CommandBinding 
     Command="ApplicationCommands.Save" 
     CanExecute="CommandBinding_CanExecute" 
     Executed="CommandBinding_Executed" 
    /> 
</Window.CommandBindings> 

i mój kod z opóźnieniem wygląda trochę tak:

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
{ 
    e.CanExecute = (
     _presenter.SelectedStore != null && 
     _presenter.SelectedStore.IsValid); 
} 

Odpowiedz

11

Model-View-ViewModel (MVVM) Wzór projektu ma na celu osiągnięcie dokładnie tego celu, a Josh Smith's excellent article wyjaśnia, jak go zastosować.

Do poleceń można używać klasy RelayCommand opisanej w tym artykule.

Ponieważ masz już obiekt prezentera, możesz pozwolić klasie ujawnić właściwość ICommand, która implementuje żądaną logikę, a następnie powiązać XAML z tym poleceniem. Wszystko to zostało wyjaśnione w artykule.

+0

Świetny link - okrzyki! –

0

Jeśli szczególnie chcesz spróbować powiązać polecenie w ViewModel z jednym z poleceń aplikacji w XAML, musisz zbudować infrastrukturę, aby to zrobić samodzielnie. Idę jednak robiąc to in this answer, co pozwala na zrobienie czegoś takiego:

<local:RoutedCommandHandlers.Commands> 
    <local:RoutedCommandHandler RoutedCommand="ApplicationCommands.Save" 
           Command="{Binding TheSaveCommand}" /> 
</local:RoutedCommandHandlers.Commands> 
Powiązane problemy