2016-12-12 1 views
0

Ich las eine MVVM tutorial und ich verlor im Commands Teil.MVVM ICommand und Delegate

using System; 
using System.Windows.Input; 

namespace MVVMDemo { 

    public class MyICommand : ICommand { 
     Action _TargetExecuteMethod; 
     Func<bool> _TargetCanExecuteMethod; 

     public MyICommand(Action executeMethod) { 
     _TargetExecuteMethod = executeMethod; 
     } 

     public MyICommand(Action executeMethod, Func<bool> canExecuteMethod){ 
     _TargetExecuteMethod = executeMethod; 
     _TargetCanExecuteMethod = canExecuteMethod; 
     } 

     public void RaiseCanExecuteChanged() { 
     CanExecuteChanged(this, EventArgs.Empty); 
     } 

     bool ICommand.CanExecute(object parameter) { 

     if (_TargetCanExecuteMethod != null) { 
      return _TargetCanExecuteMethod(); 
     } 

     if (_TargetExecuteMethod != null) { 
      return true; 
     } 

     return false; 
     } 

     // Beware - should use weak references if command instance lifetime 
     is longer than lifetime of UI objects that get hooked up to command 

     // Prism commands solve this in their implementation public event 
     EventHandler CanExecuteChanged = delegate { }; 

     void ICommand.Execute(object parameter) { 
     if (_TargetExecuteMethod != null) { 
      _TargetExecuteMethod(); 
     } 
     } 
    } 
} 

verstehe ich nicht den Zweck der RaiseCanExecuteChanged Methode und die Linie EventHandler CanExecuteChanged = delegate { };. Ich habe gelesen, dass EventHandler ein Delegat ist, aber welche Art von Delegat ist das? Was gibt die delegate { }; Anweisung zurück?

+0

Zweck: http://stackoverflow.com/questions/6425923/canexecutechanged-event-of-icommand – Fruchtzwerg

+0

Normalerweise Ihre 'UI' Elemente wie' Button's mit definierten 'Command's nennen' canExecute' Methode. Dies wird sie davon abhalten, 'NullReferenceException' zu werfen. Aus diesem Grund ist der canExecuteChanged als leerer Delegat definiert. Probieren Sie es selbst aus und sehen Sie, ob Sie eine Ausnahme mit einem einfachen 'Button' sehen können. – XAMlMAX

Antwort

3

Beantworten Sie Ihre zweite Frage, ja EventHandler ist Delegat des Typs void EventHandler(object sender, EventArgs args). Die folgende Zeile ist ein standardmäßiger (leerer) anonymer Delegat, der dem EventHandler zugewiesen ist. Kann verhindert werden, dass NullReferenceException. Unterhalb Linie auch geschrieben werden kann:

EventHandler canExecute = delegate { }; 

Um hier das Verständnis der Nutzung von RaiseCanExecuteChanged lesen Sie diese Antwort zu erhalten: https://stackoverflow.com/a/4531378/881798

- (von @Will)

RaiseCanExecuteChanged kann sein wird vom Code im View-Modell aufgerufen, wenn sich die Fähigkeit des auszuführenden Befehls geändert hat. Die Schaltfläche "Speichern" gibt beispielsweise false zurück, wenn Benutzername und Kennwort leer sind. Wenn sie jedoch gefüllt sind, ruft die VM RaiseCanExecuteChanged auf und wenn die Schaltfläche den Befehl anfordert, ob sie ausgelöst werden kann, antwortet sie jetzt positiv.

+4

Psst, RaiseCanExecuteChanged kann vom Code im View-Modell aufgerufen werden, wenn sich die Fähigkeit des auszuführenden Befehls geändert hat. Die Schaltfläche zum Speichern gibt beispielsweise false zurück, wenn Benutzername und Kennwort leer sind. Wenn sie jedoch gefüllt sind, ruft die VM RaiseCanExecuteChanged auf. Wenn die Schaltfläche den Befehl fragt, ob sie ausgelöst werden kann, antwortet sie jetzt positiv. – Will

+0

Sehr gut erklärt. +1. – vendettamit

+0

(psst, du kannst das zu deiner Antwort hinzufügen, um es zu vervollständigen :) – Will

Verwandte Themen