Definindo InputBindings dentro de um estilo
Estou criando um aplicativo WPF usando o padrão de design MVVM e estou tentando estender o controle TabItem para que ele feche a guia quando o usuário clicar no botão do meio do mouse. Estou tentando conseguir isso usando InputBindings, e funciona muito bem até tentar defini-lo dentro de um estilo. Aprendi que você não pode adicionar InputBindings a um estilo, a menos que você o anexe usando um DependencyProperty. Então eu segui esse post semelhanteaqui... e funciona ... quase. Posso fechar uma guia usando o botão do meio do mouse, mas não funcionará em nenhuma das outras guias (todas as guias são adicionadas em tempo de execução e herdam o mesmo estilo).
Então eu preciso de ajuda. Por que isso funcionaria apenas na primeira vez, e não depois? Obviamente, eu poderia criar um controle personalizado que herda de um TabItem e fazê-lo funcionar, mas gostaria de descobrir isso, pois posso ver isso sendo expandido em meus projetos. Eu não sou especialista em DependencyProperties, então por favor me ajude. Obrigado!
Estilo:
<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);
}
}