Ho un UserControl che aggiunge un CommandBinding alla sua raccolta CommandBindings per gestire un comando specifico. Successivamente, utilizzo questo controllo in una finestra e desidero aggiungere un altro binding a quello stesso controllo per aggiungere ulteriore comportamento. Il problema però è che quando faccio questo sembra che quando aggiungo un altro CommandBind alla raccolta CommandBindings di un controllo esso sostituisca qualsiasi legame già creato per lo stesso comando. Quindi, sembra che un controllo possa avere un solo CommandBinding per controllo, è corretto?Posso avere più CommandBindings per lo stesso comando sullo stesso controllo?
Vedere il seguente esempio di codice che tenta di impostare due CommandBindings per lo stesso comando di salvataggio.
<Window x:Class="MultipleCommandBindings.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.CommandBindings>
<CommandBinding Command="Save"
Executed="CommandBinding_Executed" />
<CommandBinding Command="Save"
Executed="CommandBinding_Executed" />
</Window.CommandBindings>
<Grid>
<Button Height="23"
HorizontalAlignment="Right"
Margin="0,0,25,88"
Name="button1"
VerticalAlignment="Bottom"
Width="75"
Command="Save">Button</Button>
</Grid>
Originariamente mi aspettavo sia un tempo di compilazione o di un'eccezione di runtime quando ha scritto questo codice, ma sono rimasto sorpreso che non si lamentava. Poi sono rimasto deluso dal fatto che il mio gestore CommandBinding_Executed viene chiamato una volta invece del doppio come speravo.
Aggiornamento: Dopo un po 'di prove sembra che il mio secondo CommandBinding non sovrascrive il mio primo, ma invece sembra che anche se non sto impostazione gestito per vero nel mio gestore di eventi che il legame il primo comando inghiotte il comando. Sono abbastanza sicuro a questo punto che la soluzione al mio problema è capire perché il comando indirizzato non si sta propagando oltre il primo gestore anche se Handled non è impostato su true.
Aggiornamento: ho trovato this great little tidbit di informazioni che conferma solo alcuni dei comportamenti strani dietro comando di routing in WPF.
Aggiornamento: Un pensiero su come aggirare il fatto che sembra che non ci può essere un solo CommandBinding efficace per il comando è che sembra che la classe predefinita CommandBinding espone eseguito e CanExecute come eventi che naturalmente come tutti gli eventi possono avere più gestori. L'idea è quindi di avere un modo diverso dal metodo CommandBindings.Add standard per aggiungere altri gestori a un comando. Forse questo potrebbe essere fatto tramite un metodo di estensione sulla classe Control e la combinazione con una classe personalizzata CompositeCommandBinding che ci consente di aggregare più associazioni all'interno di un binding principale.
L'unica soluzione a cui posso pensare è iscriversi all'evento Click di Button, quindi lanciare ViewCode di View come ViewModel e utilizzare manualmente var per eseguire i comandi 2. –