2013-01-09 2 views
4

Donc, pour garder la question simple ce dont j'ai besoin par exemple est d'utiliser quelque chose comme ça des dizaines de fois; Sauf évidemment je ne veux pas coller cette douzaine de fois partout où j'en ai besoin. J'ai donc essayé de les plier dans un ContentControl, quelque chose comme ça; Avec l'idée que je pourrais substituer tout cela par instance en appelant simplement le modèle comme;Déclencheurs d'interaction intégrés dans ContentControl

<ContentControl Style="{StaticResource MyThingy}"/> 

Sauf le problème est, lorsqu'il est incorporé dans ContentControl, l'interaction Triggers ne semblent pas tirer au large. Il affichera bien l'objet sur le modèle, mais semble ignorer les déclencheurs? Donc, la question est: pourquoi les déclencheurs attachés à l'élément structuré sont-ils ignorés, ou y a-t-il une meilleure façon d'accomplir ce que je veux?

Répondre

4

Ce n'est pas que les Interaction.Triggers ne sont pas appelés - ils SONT appelés, c'est le ChangePropertyAction qui est problématique.

Par exemple, cela fonctionne très bien:

<Style x:Key="MyThingy" TargetType="ContentControl"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ContentControl"> 
        <Rectangle Fill="Red"> 
         <i:Interaction.Triggers> 
          <i:EventTrigger EventName="MouseLeftButtonDown"> 
           <ei:ChangePropertyAction TargetObject="{Binding RelativeSource={RelativeSource TemplatedParent}}" 
               PropertyName="Visibility" 
               Value="Collapsed" /> 
          </i:EventTrigger> 
         </i:Interaction.Triggers> 
        </Rectangle> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Remarquez les seuls changements que j'ai été 1. Faire le rouge rectangle (afin que vous puissiez mieux voir quand il disparaît) et 2. Faire la gâchette cacher la rectangle dès que vous cliquez sur le bouton.

Alors pourquoi mon code fonctionne-t-il? Parce qu'au lieu d'utiliser TargetName, j'utilise TargetObject et la liaison au parent gabarit. Vous ne pouvez pas cibler des éléments dans le modèle via le nom, c'est un nom différent, aussi loin que je me souvienne que TargetName ne fonctionne pas dans Styles du tout, seulement dans ControlTemplate. Triggers

+0

Merci, mais je n'essaie pas de faire le 'Rectangle' disparaît sur le clic de la souris, j'essaye de faire un autre objet sur la même vue devenir' Visible' en dehors du 'ControlTemplate' à la place (d'où le' TargetName = "AnotherObjectOnTheView" ') ainsi disons que j'ai un objet sur le Même vue que le modèle de style nommé 'AnotherObjectOnTheView' et je veux des dizaines d'endroits sur lesquels vous pouvez cliquer pour rendre visible 'Visible', où les Rectangles et Triggers entrent. J'ai essayé le TargetObject mais cela ne semble pas rendre "AnotherObjectOnTheView" visible:/ –

+0

@ChrisW Votre question était _ "Pourquoi les déclencheurs attachés à l'élément modélisé sont-ils ignorés?" - la réponse est - Ils ne le sont pas, vous n'utilisez pas le 'ChangePrope rtyAction' correctement comme je l'ai montré dans ma réponse. Votre nouvelle question est quelque chose comme _ "Puis-je changer une propriété d'un autre contrôle d'une liaison de style en utilisant l'attribut TargetName" _ et la réponse est * non *, cela ne peut pas être fait. Je recommanderais quelque chose comme un 'EventToCommand' pour déclencher une modification dans le ViewModel. Par exemple une propriété bool dans le ViewModel auquel 'Visibility' de' AnotherObjectOnTheView' se liera. – Blachshma

+0

Ou directement utiliser le 'ChangePropertyAction' pour changer cette propriété dans le ViewModel (en se liant au DataContext de MainWindow/UserControl) – Blachshma