2009-07-16 5 views
2

Ich habe eine Schaltfläche Strip Benutzerkontrolle, die ich auf den meisten meiner Formulare haben möchte.WPF - CanExecute löst nicht aus, wenn Befehle von einem Benutzersteuerelement ausgelöst werden

Ich habe die Befehle wie folgt hinzugefügt ...

public ICommand Create 
    { 
     get 
     { 
      return buttonCreate.Command; 
     } 
     set 
     { 
      buttonCreate.Command = value; 
     } 
    } 

ich gesetzt habe diese als Abhängigkeitseigenschaften, so kann ich an sie binden ...

 public static readonly DependencyProperty CreateCommandProperty = 
     DependencyProperty.Register(
     "Create", 
     typeof(ICommand), 
     typeof(StandardButtonStrip), 
     new PropertyMetadata((ICommand)null)); 

Ich bin dann Bindung mein Usercontrol auf einen Befehl ...

<commoncontrols:StandardButtonStrip HorizontalAlignment="Stretch" Create="{Binding CreateCommand}" /> 

ich den Befehl Einrichten bin wie folgt ...

_viewModel.CreateCommand = new DelegateCommand<object>(OnCreateCommand, CanCreate); 

aber trotz der Tatsache, dass ich immer True auf meine CanCreate-Methode zurückgibt, ist die Schaltfläche deaktiviert ... Wenn ich einen Breakpoint bei der Rückgabe true setzen, wird es nie ausgelöst!

public bool CanCreate(object parm) 
    { 
     return true; 
    } 

Ich habe dies versucht, um zu sehen, ob es die Bindung aktualisieren wird, aber keine Freude!

_viewModel.CreateCommand.RaiseCanExecuteChanged(); 

denke ich, das Problem auf die Benutzersteuerung nach unten und, wie ich den Befehl bin vorbei als eine Eigenschaft, aber nicht sicher ...

Kann jemand helfen?

Cheers,

Andy

Antwort

5

Der Weg folgt aussieht, haben Sie eine Abhängigkeitseigenschaft auf einem View-Modell. Wenn Sie wirklich MVVM verwenden, ist das definitiv nicht der richtige Weg (nicht wegen religiöser Befolgung eines Musters, sondern weil es nicht der optimale Weg ist).

Zunächst ist Ihr View-Modell ein DependencyObject?

Wenn dies der Fall ist, sollten Sie es auf eine Klasse herabstufen, die INotifyPropertyChanged implementiert. Warum? Weil die Command-Eigenschaft der Schaltfläche eine DependencyProperty selbst ist (von ButtonBase geerbt) und die Datenbindung bereits unterstützt.

Wenn nicht, dann wird eine Abhängigkeitseigenschaft nicht funktionieren, was in Ordnung ist, da Sie in Ihrem Ansichtsmodell überhaupt keine Abhängigkeitseigenschaften haben sollten.

Was Sie tun sollten, ist das View-Modell als DataContext für Ihre Kontrolle (Ich vermute, Sie haben bereits eingerichtet). Dann ist Ihre Ansicht Create auf eine Ebene ICommand Modell ändern, und binden die Create die Command-Eigenschaft wie folgt aus (in Ihrem Standard-StandardButtonStrip Stil)

<Button Name="createButton" HorizontalAlignment="Stretch" Command="{Binding CreateCommand}" /> 

Auf diese Weise wird es noch wiederverwendbar sein, brauchen Sie nur, dass jeder Ansicht, um sicherzustellen, Das Modell, das Sie mit Ihrem Benutzersteuerelement verknüpfen, hat eine Eigenschaft CreateCommand vom Typ ICommand (und dieses Ansichtsmodell wird standardmäßig auf das Button-Steuerelement vererbt - eines der nettesten Dinge, die sich die WPF-Jungs ausgedacht haben).

Also zur Erinnerung, Sie sollten es anders herum tun, mehr oder weniger.

Ich hoffe, das war hilfreich, Prost.

+0

Danke, das hat gut funktioniert! –

0

Haben Sie die Funktionalität des Benutzersteuerelements außer Kraft gesetzt?

Ein häufiges Problem ist das Überschreiben einer Methode ohne Aufruf der Implementierung der Basis. Wenn Sie z. B. OnContentChanged() ohne Aufruf von base.OnContentChanged() außer Kraft gesetzt haben, haben Sie möglicherweise die Auslösung des Ereignisses ContentChanged versehentlich unterdrückt.

1

Eine Einschränkung auf die akzeptierte Antwort -

einen Delegaten Befehl verwenden konnte ich nur bekommen dies funktioniert, wenn ich ein neues

erstellt

Command<T> : DelegateCommand<T> und hakte den Command Manager auf.

event EventHandler ICommand.CanExecuteChanged 
{ 
add { CommandManager.RequerySuggested += value; } 
remove { CommandManager.RequerySuggested -= value; } 
} 
+0

Das ist wirklich wichtig. Verbrachte fast eine Stunde, weil ich das vermisst habe. – Tobias