Frage

Ich beantrage das MVVM Muster pro Josh Smith und Schwierigkeiten. Ich habe das Problem hier erforscht und kann nicht die Syntax ganz richtig zu sein scheinen.

Der folgende Code sieht für mich wie es die erforderliche Syntax folgt, aber Visual Studio meldet Fehler „Delegate‚System.Action‘‚2‘übernimmt keine Argumente“ auf der Linie angezeigt.

Kann jemand sehen, wo ich einen Fehler mache? Dank!
+ Tom

    RelayCommand _relayCommand_MoveUp;
    public ICommand RelayCommand_MoveUp
    {
      get
      {
        if (_relayCommand_MoveUp == null)
        {
          _relayCommand_MoveUp = new RelayCommand(
          (sender, e) => this.Execute_MoveUp(sender, e),     **ERROR REPORTED HERE**
          (sender, e) => this.CanExecute_MoveUp(sender, e));
          return _relayCommand_MoveUp;
        }
      }
    }

    private void Execute_MoveUp(object sender, ExecutedRoutedEventArgs e)
    {
      if (_selectedFolder != null)
      {
        _selectedFolder.SelectParent();
      }
    }

    private void CanExecute_MoveUp(object sender, CanExecuteRoutedEventArgs e)
    {
      e.CanExecute = (_selectedFolder != null) && (_selectedFolder.Parent != null);
        }


//And from Josh Smith:

  public class RelayCommand : ICommand
  {
    public RelayCommand(Action<object> execute);
    public RelayCommand(Action<object> execute, Predicate<object> canExecute);

    public event EventHandler CanExecuteChanged;

    [DebuggerStepThrough]
    public bool CanExecute(object parameter);
    public void Execute(object parameter);
  }
War es hilfreich?

Lösung

Die RelayCommand ist kein RoutedCommand, was ich denke, ist, wo Sie verwirrt enden.

Die Konstrukteure für das Relay Kommando übernehmen eine Aktionsdelegate und optional Prädikats delegieren . Diese Delegierten nehmen Sie nicht eine EventArgs, nur das einzelne Objekt Parameter, weshalb Sie ein Fehler auftritt. Das Prädikat erfordert auch eine Rückgabetyp Bool, das der nächste Fehler ist werden Sie erhalten. Im CanExecute Prädikat statt e.CanExecute der Einstellung, wie Sie mit einem RoutedCommand tun kehren Sie einfach wahr / falsch.

Hier ist, wie es aussehen sollte:

public ICommand RelayCommand_MoveUp
{
  get
  {
    if (_relayCommand_MoveUp == null)
    {
      _relayCommand_MoveUp = new RelayCommand(Execute_MoveUp, CanExecute_MoveUp);

    }
    return _relayCommand_MoveUp;
  }
}

private void Execute_MoveUp(object sender)
{
  if (_selectedFolder != null)
  {
    _selectedFolder.SelectParent();
  }
}

private void CanExecute_MoveUp(object sender)
{
  return (_selectedFolder != null) && (_selectedFolder.Parent != null);
}


EDIT (Hinzugefügt von Diskussion in den Kommentaren):

Wenn Sie etwas mehr wie die RoutedCommands verwenden möchten, die die Viewmodels mehr abhängig von WPF spezifischen Ansichten machen, gibt es einige gute Möglichkeiten zur Verfügung.

Das Diskussion rel="nofollow die ganze bekam Idee RoutedCommands in Verbindung mit MVVM mit gestartet.

Und hier eine sehr solide Lösung für die von Josh Smith präsentiert Fragen und Bill Kempf.

Andere Tipps

An diesem Wochenende (22. August) Josh Smith eingecheckt neuen Änderungen in Codeplex für seine MvvmFoundation Projekt, das die Art und Weise RelayCommand arbeitet für die Teilnehmer mit einem Parameter ändert. Vorsicht!

Um einen Parameter an die Delegaten übergeben, müssen Sie sein neues RelayCommand Konstruktor verwenden, anstatt:

    public ICommand GotoRegionCommand
    {
        get
        {
            if (_gotoRegionCommand == null)
                _gotoRegionCommand = new RelayCommand<String>(GotoRegionCommandWithParameter);
            return _gotoRegionCommand;
        }
    }
    private void GotoRegionCommandWithParameter(object param)
    {
        var str = param as string;
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top