wpf - Definiendo InputBindings dentro de un estilo
mvvm dependency-properties (2)
Estoy creando una aplicación WPF usando el patrón de diseño MVVM, y estoy tratando de extender el control TabItem para que cierre la pestaña cuando el usuario hace clic en el botón central del mouse. Estoy tratando de lograr esto usando InputBindings, y funciona muy bien hasta que trato de definirlo dentro de un estilo. Aprendí que no puede agregar InputBindings a un estilo a menos que lo adjunte utilizando una propiedad Dependency. Así que seguí este post similar here... y funciona ... casi. Puedo cerrar una pestaña con el botón central del mouse, pero no funcionará en ninguna de las otras pestañas (todas las pestañas se agregan en tiempo de ejecución y heredan el mismo estilo).
Así que necesito un poco de ayuda. ¿Por qué solo funcionaría esto la primera vez, y no después? Obviamente, podría crear un control personalizado que se hereda de un elemento de tabla y hacerlo funcionar, pero me gustaría resolverlo, ya que puedo verlo ampliado en mis proyectos. No soy un experto en propiedades de dependencia, así que por favor, ayúdenme. ¡Gracias!
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>
Clase
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);
}
}
No importa, lo descubrí yo mismo. Al final, ni siquiera usé la clase Adjuntar arriba ... en lugar de eso, utilicé InputBindings en la Plantilla ControlTemplate para TabItem (que es un borde), así que se parecía a esto ... No sé por qué no pensé de esto en primer lugar .. :)
<ControlTemplate TargetType="{x:Type TabItem}">
<Grid SnapsToDevicePixels="true">
<Border x:Name="Bd" ...>
<DockPanel>
...
</DockPanel>
<Border.InputBindings>
<MouseBinding MouseAction="MiddleClick"
Command="{Binding CloseCommand}"/>
</Border.InputBindings>
</Border>
</Grid>
...
</ControlTemplate>
Tu clase "Attach" funcionó bien para mí! Si alguien lo necesita, el truco es usar un estilo como este, con el modificador x: Shared:
<InputBindingCollection x:Key="inputCollection" x:Shared="False">
<KeyBinding Key="Del" Command="{Binding DeleteItemCommand}"/>
</InputBindingCollection>
<Style TargetType="{x:Type TabItem}">
<Setter Property="w:Attach.InputBindings" Value="{StaticResource inputCollection}" />
...
</Style>
¡Gracias!