2010-04-18 12 views
18

Sto creando un'app WPF utilizzando il modello di progettazione MVVM e sto cercando di estendere il controllo TabItem in modo che chiuda la scheda quando l'utente fa clic sul pulsante centrale del mouse. Sto cercando di ottenere questo risultato utilizzando InputBindings e funziona molto bene finché non provo a definirlo all'interno di uno stile. Ho appreso che non è possibile aggiungere InputBindings a uno stile a meno che non lo si colleghi utilizzando DependencyProperty. Così ho seguito questo post simile here... e funziona ... quasi. Posso chiudere una scheda utilizzando il pulsante centrale del mouse, ma non funzionerà su nessuna delle altre schede (tutte le schede vengono aggiunte in fase di esecuzione e ereditano lo stesso stile).Definizione di InputBindings all'interno di uno stile

Quindi ho bisogno di aiuto. Perché dovrebbe funzionare solo la prima volta e non dopo? Ovviamente potrei creare un controllo personalizzato che erediti da un TabItem e farlo funzionare, ma mi piacerebbe capirlo come posso vedere questo essere espanso nei miei progetti. Non sono esperto di DependencyProperties, quindi per favore aiutatemi. Grazie!

Stile:

<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); 
    } 
} 
+0

Ho incontrato il problema esatto descritto anche con il codice suggerito da Daniel. Sembra che ci sia qualcosa di molto strano quando si utilizza la classe Allega sopra, specialmente in uno stile. Ho scoperto che DataContext era nullo "a volte" quando sono stati aggiunti gli InputBindings, quindi quando l'associazione si è verificata non è riuscito a individuare i comandi. Non ho mai trovato una soluzione, ma alla fine ho duplicato i binding come nella risposta seguente. – Asheh

risposta

14

Non importa, ho capito io. Ho finito per non usare nemmeno la classe Attach sopra ... invece ho usato InputBindings sul ControlTemplate per il TabItem (che è un Border), quindi sembrava qualcosa del genere ... Non so perché non ho pensato di questo in primo luogo .. :)

<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> 
+0

Non mi piace questa soluzione perché devo sovrascrivere qualsiasi modello che ho creato ... –

14

La tua classe "Allegare" ha funzionato bene per me! Se qualcuno ha bisogno, il trucco è in stile uso in questo modo, con la x: in comune modificatore:

<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> 

Grazie!

Problemi correlati