2 Stimmen

Wie sendet man Befehlsparameter in Mvvm Silverlight 5

Ich habe Icommand in meiner mvvm-Architektur als SimpleCommand.cs implementiert

 public class SimpleCommand<T1, T2> : ICommand
{
    private Func<T1, bool> canExecuteMethod;
    private Action<T2> executeMethod;

    public SimpleCommand(Func<T1, bool> canExecuteMethod, Action<T2> executeMethod)
    {
        this.executeMethod = executeMethod;
        this.canExecuteMethod = canExecuteMethod;
    }

    public SimpleCommand(Action<T2> executeMethod)
    {
        this.executeMethod = executeMethod;
        this.canExecuteMethod = (x) => { return true; };
    }

    public bool CanExecute(T1 parameter)
    {
        if (canExecuteMethod == null) return true;
        return canExecuteMethod(parameter);
    }

    public void Execute(T2 parameter)
    {
        if (executeMethod != null)
        {
            executeMethod(parameter);
        }
    }

    public bool CanExecute(object parameter)
    {
        return CanExecute((T1)parameter);
    }

    public void Execute(object parameter)
    {
        Execute((T2)parameter);
    }

    public event EventHandler CanExecuteChanged;

    public void RaiseCanExecuteChanged()
    {
        var handler = CanExecuteChanged;
        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }
}

Und implementiert diese ICommand in meinem viewModel wie folgt:

private ICommand printCommand;

    public ICommand PrintCommand
    {
        get { return printCommand; }
        set { printCommand = value; }
    }

myviewmodel() // in Constructor of ViewModel
 {

   this.PrintCommand = new SimpleCommand<Object, EventToCommandArgs>(ExecutePrintCommand);
}

 }

In XAML: Ich habe Command="{Binding PrintCommand}" aufgerufen.

<Button Content="Print Button" Command="{Binding PrintCommand}" Width="120" Height="25" Margin="3"></Button>

Es funktioniert einwandfrei...

Aber wenn ich versuche, CommandParameter an Command As zu senden:

<Button Content="Print Button" Command="{Binding PrintCommand}" Width="120" Height="25" Margin="3" CommandParameter="{Binding ElementName=grdReceipt}"></Button>

Dann wird der Befehl nicht ausgeführt. und gibt Fehler wie:

Objekt vom Typ 'System.Windows.Controls.Grid' konnte nicht in den Typ PropMgmt.Shared.EventToCommandArgs'.

Bitte helfen Sie uns, vielen Dank im Voraus.

2voto

Jehof Punkte 33506

Das Problem ist dieser Teil in Ihrer SimpleCommand-Implementierung

public void Execute(object parameter){
  Execute((T2)parameter);
}

T2 ist in Ihrem Fall vom Typ EventToCommandArgs sondern als Parameter

CommandParameter="{Binding ElementName=grdReceipt}"

Sie passieren eine System.Windows.Controls.Grid , was zu der von Ihnen erwähnten Ausnahme führt.

Außerdem ist Ihre Implementierung des Befehls nicht korrekt. Der an CanExecute und Execute übergebene Parameter ist das gleiche Objekt. Die folgende Implementierung funktioniert mit nur einem generischen Typ.

public class SimpleCommand<T1> : ICommand
{
    private Func<T1, bool> canExecuteMethod;
    private Action<T1> executeMethod;

    public SimpleCommand(Func<T1, bool> canExecuteMethod, Action<T1> executeMethod)
    {
        this.executeMethod = executeMethod;
        this.canExecuteMethod = canExecuteMethod;
    }

    public SimpleCommand(Action<T1> executeMethod)
    {
        this.executeMethod = executeMethod;
        this.canExecuteMethod = (x) => { return true; };
    }

    public bool CanExecute(T1 parameter)
    {
        if (canExecuteMethod == null) return true;
        return canExecuteMethod(parameter);
    }

    public void Execute(T1 parameter)
    {
        if (executeMethod != null)
        {
            executeMethod(parameter);
        }
    }

    public bool CanExecute(object parameter)
    {
        return CanExecute((T1)parameter);
    }

    public void Execute(object parameter)
    {
        Execute((T1)parameter);
    }

    public event EventHandler CanExecuteChanged;

    public void RaiseCanExecuteChanged()
    {
        var handler = CanExecuteChanged;
        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }
}

Mit dieser Implementierung können Sie definieren:

this.PrintCommand = new SimpleCommand<object>(ExecutePrintCommand);

Da Ihr ExecutePrintCommand ein Objekt als Parameter erhält, müssen Sie eine Typprüfung durchführen oder auf den benötigten Typ casten. In Ihrem Fall erhalten Sie ein System.Windows.Controls.Grid .

public void ExecutPrintCommand(object parameter) {
    System.Windows.Controls.Grid grid = parameter as System.Windows.Controls.Grid;

    if (grid != null) {
      // do something with the Grid
    }
    else {
      // throw exception or cast to another type you need if your command should support more types.
    }
  }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X