Frage

Das folgende Beispiel RoutedCommand funktioniert.

Jedoch wird die Handhabung für die Schaltfläche führt den Befehl ist in dem Code-Behind der Ansicht . Die Art, wie ich MVVM verstehen, ist es sollte im Ansichtsmodell sein.

Wenn ich jedoch das Verfahren auf das Ansichtsmodell bewegen (und es öffentlich aus), erhalte ich die Fehlermeldung „ ManagedCustomersView keine Definition von OnSave enthält “. Selbst wenn ich die RoutedCommand zweiten Parameter typeof (ManageCustomersViewModel) ändern, erhalte ich den gleichen Fehler.

Wie kann ich den Befehl Handler aus dem View-Code-Behind auf das Ansichtsmodell bewegen?

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));
    }
}
War es hilfreich?

Lösung

Sie erhalten eine Eigenschaft von Ihrem Ansichtsmodell aussetzen, der den Befehl verweist.

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

Dann in der XAML

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

Allerdings Sie finden es möglicherweise einfacher, die RelayCommand so dass Sie können auch die tatsächliche Befehlslogik in Ihrem Modell definieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top