2

mvvm アーキテクチャに Icommand を SimpleCommand.cs として実装しました

 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);
        }
    }
}

そして、この ICommand を viewModel に次のように実装しました。

private ICommand printCommand;

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




myviewmodel() // in Constructor of ViewModel
 {

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

 }

XAML の場合: Command="{Binding PrintCommand}" を呼び出しました

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

それは完璧に動作します...

しかし、CommandParameter を Command As に送信しようとすると:

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

その後、コマンドは実行されていません。およびエラーを次のように与える:

タイプ 'System.Windows.Controls.Grid' のオブジェクトをタイプ 'PropMgmt.Shared.EventToCommandArgs' にキャストできません。

助けてください。事前に感謝します。

4

1 に答える 1

2

問題は、SimpleCommand実装のこの部分です

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

T2あなたの場合はタイプEventToCommandArgsですが、パラメータとして

CommandParameter="{Binding ElementName=grdReceipt}"

を渡すとSystem.Windows.Controls.Grid、前述の例外が発生します。

また、コマンドの実装が正しくありません。CanExecuteとExecuteに渡されるパラメーターは同じオブジェクトです。次の実装は、1つのジェネリック型のみを使用して機能します。

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);
        }
    }
}

この実装を使用して、以下を定義できます。

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

ExecutePrintCommandはオブジェクトをパラメーターとして取得するため、型チェックを実行するか、必要な型にキャストする必要があります。あなたの場合、あなたはを得るでしょう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.
    }
  }
于 2013-03-13T07:58:17.150 に答える