2009-04-30 5 views
8

Następujący przykład RoutedCommand działa.Jak przenieść moją instrukcję obsługi RoutedCommand z View-codebehind do ViewModel?

Jednak obsługa przycisku, który wykonuje polecenie , jest w kodzie będącym częścią widoku. Sposób, w jaki rozumiem MVVM, to powinien być w ViewModel.

Jednak po przeniesieniu metody do ViewModel (i zmianie jej na publiczny) pojawia się błąd "ManagedCustomersView nie zawiera definicji OnSave". Nawet jeśli zmienię drugi parametr RoutedCommand na typeof (ManageCustomersViewModel), pojawia się ten sam błąd.

Jak mogę przenieść obsługę poleceń z widoku-kodu do modelu ViewModel?

ManageCustomersView.xaml:

<UserControl.CommandBindings> 
    <CommandBinding Command="local:Commands.SaveCustomer" Executed="OnSave"/> 
</UserControl.CommandBindings> 
... 
<Button Style="{StaticResource formButton}" 
    Content="Save" 
    Command="local:Commands.SaveCustomer" 
    CommandParameter="{Binding Id}"/> 

ManageCustomersView.xaml.cs:

private void OnSave(object sender 
        , System.Windows.Input.ExecutedRoutedEventArgs e) 
{ 
    int customerId = ((int)e.Parameter); 
    MessageBox.Show(String.Format 
     ("You clicked the save button for customer with id {0}.", customerId)); 
} 

Commands.cs:

using System.Windows.Input; 
using TestDynamicForm123.View; 

namespace TestDynamicForm123 
{ 
    public class Commands 
    { 
     public static RoutedCommand SaveCustomer = 
      new RoutedCommand("SaveCustomer", typeof(ManageCustomersView)); 
    } 
} 

Odpowiedz

8

Wyeksponujesz właściwość z Twojego ViewModel, która odwołuje się do polecenia.

class MyViewModel 
{ 
    public RoutedCommand SaveCmd{ get{ return Commands.SaveCustomer; } } 
} 

Następnie w XAML

<Button Command="{Binding SaveCmd}" /> 

Jednak może się okazać, że łatwiej używać RelayCommand, dzięki czemu można określić rzeczywistą logikę polecenia w modelu, jak również.

+0

hmm, dodałem te dwa bity kodu, a teraz kliknięcie mojego przycisku nic nie robi. Mogę wyjąć UserControl.CommandBindings lub go opuścić, ale to nie ma żadnego efektu. Nic w wynikach. Co jeszcze muszę zmienić? –

+0

Spójrz na RoutedCommand, dzięki czemu jest o wiele łatwiej. Możesz wykonać polecenie return new RoutedCommand (p => MessageBox.Show ("Saving.")) Z poziomu twojego modelu widoku. –

+0

Myślę, że poprzedni komentator oznaczał RelayCommand. –

Powiązane problemy