Я создаю приложение WPF с помощью шаблона разработки MVVM, и я пытаюсь расширить управление TabItem так, чтобы это закрыло вкладку, когда пользователь щелкает средней кнопкой мыши. Я пытаюсь достигнуть этого использования InputBindings, и это работает очень хорошо, пока я не пытаюсь определить его в стиле. Я узнал, что Вы не можете добавить InputBindings к стилю, если Вы не присоединяете его с помощью DependencyProperty. Таким образом, я следовал этому подобному сообщению здесь..., и оно работает... почти. Я могу закрыть одну вкладку с помощью средней кнопки мыши, но она не будет работать ни над одной из других вкладок (все вкладки добавляются во времени выполнения и наследовали тот же стиль).
Таким образом, я нуждаюсь в некоторой помощи. Почему это только работало бы в первый раз, и не после? Очевидно, я мог создать пользовательский элемент управления, который наследовался TabItem, и заставьте его работать, но я хотел бы понять это, поскольку я вижу, что это расширено в моих проектах. Я не эксперт по DependencyProperties, поэтому выручите меня.Спасибо!
Стиль:
Класс
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);
}
}
Ничего страшного, я сам догадался. В итоге я даже не использовал класс Attach выше ... вместо этого я использовал InputBindings в ControlTemplate для TabItem (который является границей), поэтому это выглядело примерно так ... Я не знаю, почему я не подумал этого в первую очередь .. :)
<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>