Definition InputBindings innerhalb eines Stylesheets

Ich bin erstellen einer WPF-Anwendung mithilfe des MVVM design pattern, und ich bin versucht zu erweitern, die TabItem-Steuerelement so, dass es die Registerkarte schließt, wenn der Benutzer klickt mit der mittleren Maustaste. Ich bin versucht, dies zu erreichen mit InputBindings, und es funktioniert sehr gut, bis ich versuche, Sie zu definieren, innerhalb eines Stylesheets. Ich habe gelernt, dass man nicht hinzufügen, InputBindings, um einen Stil, es sei denn, Sie legen es mit einem DependencyProperty. Also folgte ich diesem ähnlichen Beitrag hier... und es funktioniert... fast. Kann ich schließen Sie eine Registerkarte, indem Sie die mittlere Maustaste, aber es funktioniert nicht auf eine der anderen Registerkarten (alle Registerkarten, die während der Laufzeit Hinzugefügt werden und Erben die gleichen Stil).

So, ich brauche etwas Hilfe. Warum sollte dieses nur arbeiten für die erste Zeit und nicht nach? Natürlich könnte ich Sie erstellen ein benutzerdefiniertes Steuerelement, das erbt von einem TabItem und machen es Arbeit, aber ich würde gerne herausfinden, wie ich sehen kann dieser ausgebaut, in meinen Projekten. Ich bin kein Experte auf DependencyProperties, so bitte helfen Sie mir. Danke!

Stil:

<Style TargetType="{x:Type TabItem}">
    <Setter Property="w:Attach.InputBindings">
        <Setter.Value>
            <InputBindingCollection>
                <MouseBinding MouseAction="MiddleClick" 
                              Command="{Binding CloseCommand}"/>
            </InputBindingCollection>
        </Setter.Value>
    </Setter>
    ...
</Style>

Klasse

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);
    }
}
  • Ich habe laufen in die genau oben beschriebene problem auch mit dem code-vorgeschlagen von Daniel. Es scheint, es ist etwas sehr seltsam, wenn mithilfe der Attach-Klasse vor, vor allem in einem Stil. Ich fand, dass DataContext war null, "manchmal", wenn die InputBindings wurden Hinzugefügt, so dass, wenn die Bindung geschah es nicht, suchen Sie die Befehle. Ich habe nie eine Lösung gefunden, aber ich endete in einer doppelten Bindungen wie in der Antwort unten.
InformationsquelleAutor Brent | 2010-04-18
Schreibe einen Kommentar