Announcement

Collapse
No announcement yet.

RelayCommand :ICommand CanExecuteChanged

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • RelayCommand :ICommand CanExecuteChanged

    Hallo liebes Forum,

    .. Annäherung an MVVM - ich "erforsche" die RelayCommand Klasse und stecke da bei ein paar Verständnis Fragen:

    Code:
    class RelayCommand : ICommand
    {
    ..
     public event EventHandler CanExecuteChanged
    	  {
    		 add { CommandManager.RequerySuggested += value; }
    		 remove { CommandManager.RequerySuggested -= value; }
    	  }
    1) Das Event wird doch von den Buttons denen dieses Command zugewiesen wird aboniert. d.h. wenn das Event gefeuert wird ruft der Button dann CanExecute auf um den aktuellen Status zu ermitteln.
    Wenn jemand dieses Event aboniert (also der Button in XAML das Command-Binding hat) wird der "add" Teil aufgerufen und dort steht, daß das CanExecuteChanged Event auf dieses statische CommandManager Event hört.
    So wie ich das verstehe würde das bedeuten, daß ein Command welches mehreren Buttons zugeteilt ist auch dementsprechend oft das CommandManager Event aboniert hat.
    Das würde ja bedeuten, das der CommandManager wenn er dieses RequerySuggested feuert öfters hintereinander das selbe CanExecuteChanged von einem Command feuert und dann jeder Button für sich (obwohl eh alle dem selben Command gehorchen) aufruft. Funktioniert das so oder hab ich da ein Verstnändis Problem ?

    2) wenn ich das CanExecuteChanged manuell auslösen will so muß ich das in einer Methode nach außen verfügbar machen weil in vererbten Klassen das Event nicht direkt feuerbar ist.
    Aber selbst in meiner Basisklasse (s.o.) die nur das ICommand IF implementiert kann ich nicht mit "CanExecuteChanged(this, EventArgs.Empty)" das Event feuern. Es kommt der Fehler mit
    " .. can only appear on the left hand side of += or -=" - was laut meinem ergoogelten Wissen nur bei abgeleiteten Klassen zutrifft. Wo liegt mein (Denk)Fehler

    - danke

    Gruß Michael

  • #2
    Hallo,

    ad 1:
    es ist nicht das Selbe CanExecuteChanged-Ereignis, da der Handler (= Command-Source = Button) ein anderer ist, aber es funktioniert so wie du es verstanden hast. Du kannst du mit einem Reflector (wie ILSpy) auch den dazugehörigen Code vom CommandManager anschauen um das nachzuprüfen.

    ad 2:
    Da du das Ereignis an den CommandManager bzw. dessen RequerySuggested-Ereignis weiterleitest, kannst du es nicht (mehr) direkt aufrufen, da der Compiler für das Ereignis im Hintergrund (private) Delegaten in der Ereignis-deklarierenden Klasse erstellt und auf diese kann eben von einer anderen Klasse aus nicht zugegriffen werden.
    Um dennoch das Ereignis "auszulösen" kannst du hier CommandManager.InvalidateRequerySuggested(); aufrufen.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      - danke

      ad 1) freut mich das ich am richtigen Weg bin ...
      ad 2) ja - aber dann werden ja alle Commands aktualisiert - wenn ich es aber sozusagen besser weiß und nur dieses eine Command .... geht das nicht ? an den privaten Delegaten komm ich nicht ran ?

      Michael

      Comment


      • #4
        Hallo,

        ad 2:
        durch das Ereignis wird letztlich CanExecute auferufen, dort kannst du ja entscheiden ob true/false zurückgegeben wird, je nach Zustand des ViewModels.
        Du kannst auch für jeden Button eine eigene Instanz von ICommand verwenden, das ist normalerweise auch der übliche Weg.
        An den privaten Delegaten kommst du per Reflection ran, aber das sollte unbedingt vermieden werden, da es die Kapselung (eines der OOP-Prinzipien) bricht.

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment

        Working...
        X