C# neuer Konstruktor in RelayCommand

brandon28

Newbie
Registriert
Apr. 2014
Beiträge
5
Hallo,

ich möchte eine Progressbar in meine Applikation (MVVM Struktur) einbauen.

Code:
readonly ICommand instigateWorkCommand;
.

public MyViewModel()
{ this.instigateWorkCommand = new RelayCommand(o =>this.workerRunWorkerAsync, o=>!this.worker.IsBusy);
.

}

meldet den Fehler, dass keine entsprechende Überladung im Konstruktor des RelayCommand
gefunden wurde. Die IDE erzeugt auch keine Überladung automatisch
(wahrscheinlich wegen der Lambda-Expr.).

Leider habe ich keine RelayCommand Klasse mit entsprechendem Konstruktor gefunden.
Meine Kenntnisse reichen noch nicht, um einen neuen vollständigen Konstruktor ins
RelayCommand einzufügen. Auch sind die Themen BackgroundWorker und
Lambda-Expressions noch neu für mich.

Wie muss ein entsprechender Konstruktor in RelayCommand aussehen ?

Vielen Dank!

LG
Brandon
 
Zuletzt bearbeitet:
So als Beispiel, wie ich ihn verwende. Eventuell den Bedingungs-Parameter noch optional machen, ist manchmal komfortabler.

Code:
    public class RelayCommand : ICommand {
        private readonly Predicate<object> _canExecute;
        private readonly Action<object> _execute;

        /// <summary>
        ///     Erzeugt einen RelayCommand mit einem Methoden Delegaten und einem Predicate Delegaten welche beide
        ///     einen Parameter übergeben. Der Methoden Delegate stellt die Execute Methode des ICommand Interfaces dar. Der
        ///     Predicate Delegate stellt die CanExecute Methode dar.
        /// </summary>
        /// <param name="execute"> Der Methoden Delegate für die Execute Methode </param>
        /// <param name="canExecute"> Der Predicate Delegate für die CanExecute Methode </param>
        public RelayCommand( Action<object> execute, Predicate<object> canExecute) {
            if (commandName == null) {
                throw new ArgumentNullException("commandName");
            }
            if (execute == null) {
                throw new ArgumentNullException("execute");
            }
            _commandName = commandName;
            _execute = execute;
            _canExecute = canExecute;
        }

        /// <summary>
        ///     Die Methode die aufgerufen wird um zu überprüfen ob der Command ausgeführt werden kann.
        ///     Standardmäßig liefert diese true.
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        [DebuggerStepThrough]
        public bool CanExecute(object parameter) {
            return _canExecute == null || _canExecute(parameter);
        }
    }
 
Zuletzt bearbeitet:
Hallo Thaxll

neue Fehler:

Fehler 2 1-Argument: Kann nicht von "Methodengruppe" in "System.Action<object>" konvertiert werden.

Fehler 3 2-Argument: Kann nicht von "Methodengruppe" in "System.Predicate<object>" konvertiert werden.

Die Änderungen haben mehr Fehler produziert. Ich glaube, die Überladung passt nicht zum
erzeugten Object. Ich habe eine RelayCommand Klasse mit 4 Überladungen. Keine ist passend.
 
Zuletzt bearbeitet:
Du müsstest bei meiner Lösung natürlich entweder einen lambda-Ausdruck verwenden:
new RelayCommand(m => delegate { bla }, m => delegate { return true } )
oder halt einen Methodenaufruf
new RelayCommand(m => Execute(), m => CanExecute() )

Kenne die vordefinierte RelayCommand-Klasse nicht, benenn doch mal meine Variante in z.B. MegaCommand, damit du sie unterscheiden kannst.
 
Zuletzt bearbeitet:
Thaxll'ssillyia schrieb:
Code:
        public RelayCommand( Action<object> execute, Predicate<object> canExecute) {
            if (commandName == null) {
                throw new ArgumentNullException("commandName");
            }
            /* ... */
            _commandName = commandName;
        }
    }

Beim Copy/Pasten musst du auch auf commandName aufpassen - dieser Parameter wurde offenbar entfernt und der Code nicht entsprechend angepasst.

Ansonsten würde ich brandon28 empfehlen eventuell sogar ein MVVM Framework wie MVVM Light (NuGet: MvvmLight) oder Caliburn.Micro (NuGet: Caliburn.Micro) zu verwenden, um mal zu populärsten genannt zu haben.

Bei MvvmLight hast du auf jeden Fall RelayCommands overloads (auch eine Generic variante für Parameter).
 
Zurück
Oben