2012-04-10 11 views
0

Hier ist das Setup (Fremd Layout-Code entfernt) zu verwenden:Wie Command.CanExecute von einem Kind Kontrolle

Window.xaml

<Button Name="btn_Next" Command="NextPage">Next</Button> 
<ContentControl Name="contentControl1" > 
     <Binding ElementName="MainWindow" Path="CurrentPage"/> 
</ContentControl> 

Window.xaml.cs Constructor

var nextCommand = new CommandBinding(NavigationCommands.NextPage); 
    nextCommand.CanExecute += nextCommand_CanExecute; 
    nextCommand.Executed += nextCommand_Executed; 
    CommandBindings.Add(nextCommand); 

Das funktioniert gut im Basisbeispiel, wo nextCommand_CanExecute überprüft, ob die aktuelle Seite die letzte Seite ist. Diese Logik überprüft jedoch gerade ein Array und funktioniert nur für die lineare Navigation. Allerdings wird die Navigation baumartig sein und das wird nicht funktionieren, wenn die Elemente in der contentControl1 manchmal in verschiedene Richtungen verzweigen. Also, ich möchte die Benutzerkontrolle haben, die die CurrentPage die Möglichkeit hat, die CanExecute zu überschreiben. Mein Problem ist, dass ich nicht herausfinden kann, wie man die UserControl startet, um die CanExecute zu starten. Ich habe versucht, eine Reihe von CommandTarget Einstellungen nutzlos zu verwenden ... mein Kind Steuerelement hat es nie CanExecute Methode ausgelöst. Ich habe sogar versucht, die e.ContinueRouting = true im CanExecute des Elternfensters zu verwenden. Hier ist der Benutzerkontrollcode, falls das hilft.

User Control Constrtuctor:

var nextCommand = new CommandBinding(NavigationCommands.NextPage); 
    nextCommand.CanExecute += nextCommand_CanExecute; 
    CommandBindings.Add(nextCommand); 

User Control CanExecute Methode:

private void nextCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
{ 
    e.CanExecute = false; 
    e.Handled = true; 
} 

Antwort

2

Routed Befehlsereignisse Tunnel von der Wurzel der visuellen Struktur bis auf die Steuerung, die sie eingeleitet wird, und dann Blase zurück oben. Josh Smiths Artikel über geroutete Befehle hat eine gute Beschreibung, wie es funktioniert (siehe insbesondere den Abschnitt "Routed") http://joshsmithonwpf.wordpress.com/2008/03/18/understanding-routed-commands/.

Das Problem hier ist, dass Ihr Benutzer Steuerelement (innerhalb der Inhaltskontrolle), ist kein "Vorfahre" der Schaltfläche, die den Befehl ausgibt, so dass das Routingereignis nie erreicht (auch im Vorbeigehen). Angesichts der Struktur Ihres visuellen Baums glaube ich nicht, dass geroutete Befehle für Sie ausreichen werden.

Die erste Lösung, die Ihnen in den Sinn kommt, besteht darin, Ihren eigenen Mechanismus für die Delegierung von CanExecute/Executed-Logik an Ihre Benutzersteuerelemente einzurichten. Vielleicht könnten Sie eine Basisklasse oder Schnittstelle definieren, die von allen solchen Steuerelementen implementiert wird und die verschiedenen erforderlichen CanExecute/Executed-Methoden definiert. Dann können Sie einfach eine Top-Level-Implementierung haben, die das aktuell geladene Steuerelement als Interface-/Basisklasse-Typ ablegt und die entsprechende Methode aufruft.

+0

Darn, das war, was ich dachte, dass ich tun müsste ... und hatte gehofft, dass etwas bereits eingebaut war –

+0

Ich denke, der einzige Weg, um das eingebaute Ding zu arbeiten wäre, die Navigation zu beherbergen Schaltflächen innerhalb des Benutzersteuerelements, das nicht so aussieht, als würde es für Sie funktionieren. –

Verwandte Themen