我正在使用MVVM设计模式创建WPF应用程序,并尝试扩展TabItem控件,以便在用户单击鼠标中键时关闭该选项卡。我尝试使用InputBindings来实现这一目标,在定义样式时它也很有效,但只适用于第一个选项卡。我已经学到,除非使用DependencyProperty将其附加,否则无法将InputBindings添加到样式中。因此,我遵循了这篇类似的文章(在此处...)并且它几乎奏效了。我可以使用中间鼠标按钮关闭一个选项卡,但是在其他选项卡上不起作用(所有选项卡都是在运行时添加并继承相同的样式)。
所以我需要一些帮助。为什么这只有第一次运行时有效,之后就失效了?显然,我可以创建一个自定义控件,继承自TabItem并使其正常工作,但我希望弄清楚这一问题,因为我可以看到它在我的项目中得到扩展。我不是DependencyProperties的专家,请帮帮我。谢谢!
样式:
<Style TargetType="{x:Type TabItem}">
<Setter Property="w:Attach.InputBindings">
<Setter.Value>
<InputBindingCollection>
<MouseBinding MouseAction="MiddleClick"
Command="{Binding CloseCommand}"/>
</InputBindingCollection>
</Setter.Value>
</Setter>
...
</Style>
类
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);
}
}