2017-09-05 1 views
-1

J'ai un projet qui utilise WPF, C# et tout ce qu'il y a de mieux (Visual Studio 2010 aussi).WPF ControlTemplate Triggers

J'ai une liste de contrôle WPF et, dans ce ListBox, il y a un modèle de contrôle pour le ListBoxItem. Au sein de cela est une section pour les déclencheurs.

Dans ce cas particulier, la propriété de déclenchement est IsSelected, en référence à l'élément sélectionné pour la zone de liste. Ce que je souhaite faire est de nettoyer les choses en supprimant cela du contrôle ListBox et en le plaçant dans un ControlTemplate dans une liste de ressources. Quand je fais cela, il me dit à juste titre qu'il n'y a pas de 'IsSelected' dans l'élément framework.

Quelqu'un peut-il donner des suggestions sur la façon de compléter cela?

Merci.

Oh, le code XAML est ici:

<ControlTemplate.Triggers> 
       <Trigger Property="IsSelected" Value="true"> 
        <Setter TargetName="_Border" Property="Effect"> 
         <Setter.Value> 
          <DropShadowEffect ShadowDepth="0" Color="Black" Opacity="1" BlurRadius="20" /> 
         </Setter.Value> 
        </Setter> 
       </Trigger> 
      </ControlTemplate.Triggers> 

Edit: J'ai essayé ceci:

<Trigger Property="{Binding Path=IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}" Value="true"> 

Cependant, je reçois une erreur disant « A 'Reliure' ne peut pas être mis sur la Propriété 'Property' de type 'Trigger' '.

modifier supplémentaire: D'accord, voici le XAML pour la zone de liste:

<ListBox ItemsSource="{Binding ChatNodeListViewModel.ChatNodeVMs, Source={StaticResource Locator}}" Background="Transparent" Name="LbNodes" SelectedItem="{Binding ChatNodeListViewModel.SelectedNode, Source={StaticResource Locator}}" > 
      <ListBox.ItemsPanel> 
       <ItemsPanelTemplate> 
        <Canvas HorizontalAlignment="Left" VerticalAlignment="Top" Width="2000" Height="1600"/> 
       </ItemsPanelTemplate> 
      </ListBox.ItemsPanel> 
      <ListBox.ItemContainerStyle> 
       <Style TargetType="{x:Type ListBoxItem}"> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="ListBoxItem"> 

           <Border x:Name="_Border" Padding="1" SnapsToDevicePixels="true" BorderThickness="3" Margin="2" CornerRadius="5,5,5,5" BorderBrush="{Binding IsHeadNode, Converter={StaticResource ResourceKey=HeadNodeToLinearGradientBrushConverter}}" > 

            <ContentPresenter /> 
           </Border> 

           <ControlTemplate.Triggers> 
            <Trigger Property="IsSelected" Value="true"> 
             <Setter TargetName="_Border" Property="Effect"> 
              <Setter.Value> 
               <DropShadowEffect ShadowDepth="0" Color="Black" Opacity="1" BlurRadius="20" /> 
              </Setter.Value> 
             </Setter> 
            </Trigger> 
           </ControlTemplate.Triggers--> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 

        <Setter Property="Canvas.Left" Value="{Binding XCoord}"/> 
        <Setter Property="Canvas.Top" Value="{Binding YCoord}"/> 
        <EventSetter Event="PreviewMouseLeftButtonDown" Handler="lb_PreviewMouseLeftButtonDown" /> 

       </Style> 
      </ListBox.ItemContainerStyle> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <Thumb Name="myThumb" Template="{StaticResource NodeVisualTemplate}"> 

          <i:Interaction.Triggers> 
           <i:EventTrigger EventName="DragDelta"> 
            <cmd:EventToCommand Command="{Binding ChatNodeListViewModel.DragDeltaCommand, Source={StaticResource Locator}}" PassEventArgsToCommand="True"/> 
           </i:EventTrigger> 

          </i:Interaction.Triggers> 
         </Thumb> 
        </Grid> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

Donc, si vous regardez le déclencheur de modèle de contrôle ici, il est appliqué à la frontière (appelée « _Border »). Maintenant, le problème est que cela me laisse avec cette frontière séparée du modèle de contrôle pour le ListBoxItem (appelé NodeVisualTemplate). Je voudrais mettre cette bordure dans le NodeVisualTemplate, mais je ne suis pas sûr de savoir comment je vais garder ce lien à la propriété IsSelected. C'est un peu la racine du problème.

+1

Cela semble faire partie d'un modèle ListBoxItem, pas ListBox. – Clemens

+0

Vous devez partager plus de XAML, peut-être le ControlTemplate entier. Peut-être tout le XAML pour le ListBox. –

+0

Désolé les gars, je l'ai mis à jour avec plus d'informations. – TheFaithfulLearner

Répondre

1

Un Trigger vous permet simplement de nommer une propriété du contrôle vous Templating ou (si elle est un style de déclenchement) style, mais vous d'un DataTrigger Trigger sur une let valeur que vous pouvez obtenir à partir d'un Binding.

C'est beaucoup plus puissant. La classe Binding de WPF peut faire beaucoup de choses différentes. Je vais essayer cela dans le modèle Thumb, avec un RelativeSource qui recherche l'arborescence visuelle pour trouver le contrôle parent le plus proche de type ListBoxItem, puis récupère la valeur de la propriété IsSelected de ListBoxItem. Le modèle Thumb qui en résulte ne sera très utile que sur Thumbs appartenant à ListBoxItems, mais c'est OK.

<DataTrigger 
    Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}" 
    Value="true" 
    > 
    ...