Sto creando un'app WPF utilizzando il modello di progettazione MVVM e sto cercando di estendere il controllo TabItem in modo che chiuda la scheda quando l'utente fa clic sul pulsante centrale del mouse. Sto cercando di ottenere questo risultato utilizzando InputBindings e funziona molto bene finché non provo a definirlo all'interno di uno stile. Ho appreso che non è possibile aggiungere InputBindings a uno stile a meno che non lo si colleghi utilizzando DependencyProperty. Così ho seguito questo post simile here... e funziona ... quasi. Posso chiudere una scheda utilizzando il pulsante centrale del mouse, ma non funzionerà su nessuna delle altre schede (tutte le schede vengono aggiunte in fase di esecuzione e ereditano lo stesso stile).Definizione di InputBindings all'interno di uno stile
Quindi ho bisogno di aiuto. Perché dovrebbe funzionare solo la prima volta e non dopo? Ovviamente potrei creare un controllo personalizzato che erediti da un TabItem e farlo funzionare, ma mi piacerebbe capirlo come posso vedere questo essere espanso nei miei progetti. Non sono esperto di DependencyProperties, quindi per favore aiutatemi. Grazie!
Stile:
<Style TargetType="{x:Type TabItem}">
<Setter Property="w:Attach.InputBindings">
<Setter.Value>
<InputBindingCollection>
<MouseBinding MouseAction="MiddleClick"
Command="{Binding CloseCommand}"/>
</InputBindingCollection>
</Setter.Value>
</Setter>
...
</Style>
Classe
public class Attach
{
public static readonly DependencyProperty InputBindingsProperty =
DependencyProperty.RegisterAttached("InputBindings", typeof(InputBindingCollection), typeof(Attach),
new FrameworkPropertyMetadata(new InputBindingCollection(),
(sender, e) =>
{
var element = sender as UIElement;
if (element == null) return;
element.InputBindings.Clear();
element.InputBindings.AddRange((InputBindingCollection)e.NewValue);
}));
public static InputBindingCollection GetInputBindings(UIElement element)
{
return (InputBindingCollection)element.GetValue(InputBindingsProperty);
}
public static void SetInputBindings(UIElement element, InputBindingCollection inputBindings)
{
element.SetValue(InputBindingsProperty, inputBindings);
}
}
Ho incontrato il problema esatto descritto anche con il codice suggerito da Daniel. Sembra che ci sia qualcosa di molto strano quando si utilizza la classe Allega sopra, specialmente in uno stile. Ho scoperto che DataContext era nullo "a volte" quando sono stati aggiunti gli InputBindings, quindi quando l'associazione si è verificata non è riuscito a individuare i comandi. Non ho mai trovato una soluzione, ma alla fine ho duplicato i binding come nella risposta seguente. – Asheh