2009-12-27 6 views
2

Je veux le faire en XAML avec un trigger, comment le faire?Comment faire cela en XAML?

If ListBox1.SelectedIndex > -1 Then 
     Border1.Visibility = Windows.Visibility.Visible 
    Else 
     Border1.Visibility = Windows.Visibility.Hidden 
    End If 

Ce code XAML ne fonctionne PAS. SelectedIndex Le membre n'est pas valide car il ne dispose pas d'un nom de type qualifiant.

  <ListBox.Triggers> 
       <Trigger SourceName="ListBox1" Property="SelectedIndex" Value="False"> 
        <Setter TargetName="Border1" Property="Visibilty" Value="Hidden" /> 
       </Trigger> 
      </ListBox.Triggers> 

Répondre

6

Pouvez-vous me montrer comment essayez-vous de faire cela dans xaml?

Dans le cas de ce message d'erreur, vous devez mentionner le nom du type également avec la propriété à l'intérieur du déclencheur.

<Trigger SourceName="ListBox1" Property="ComboBox.SelectedIndex" Value="-1"> 
    <Setter TargetName="Border1" Property="Border.Visibility" Value="Hidden" /> 
</Trigger> 

En outre, il semble que vous ajoutez un déclencheur dans <ListBox.Triggers> collection, mais vous pouvez ajouter que EventTrigger pour cette collection. Vous devez donc décliner un Style pour votre ListBox afin d'ajouter un Trigger pour cela et votre élément Border doit être dans ControlTemplate de ListBox, mais dans votre cas Border semble être en dehors de ListBox, donc déclarer un style ne sera pas une solution. Au lieu de cela, vous devez utiliser Binding avec la propriété SelectIndex à l'aide d'un ValueConverter (par exemple IndexToVisibilityConverter). Vous devez définir ce convertisseur dans codebehind et l'ajouter dans les ressources.

<Border Visibility={Binding Path=SelectedIndex, ElementName=ListBox1, Converter={StaticResource IndexToVisibilityConverter}}/> 

Le choix est entièrement sur vos besoins.

+0

Cela ressemble plus à la route à suivre ... –

+0

Est ce que j'avais besoin ... Et cela a fonctionné, merci! –

4

Il est aussi simple que cela:

<Border x:Name="Border1" ... Visibility="Visible" ... /> 

... 

<Trigger SourceName="ListBox1" Property="ListBox.SelectedIndex" Value="-1"> 
    <Setter TargetName="Border1" Property="UIElement.Visibilty" Value="Hidden" /> 
</Trigger> 

Mise à jour

Je vois du nouveau code affiché que vous essayez d'utiliser un déclencheur directement sur la zone de liste. Le déclencheur doit être dans un ControlTemplate pour utiliser SourceName. Si votre interface utilisateur est faite avec "contrôles personnalisés" (ma préférence), vous aurez déjà un ControlTemplate pour le mettre. Sinon, vous pouvez facilement ajouter un en enveloppant votre XAML dans un "ContentControl" générique (classe de base, pas n'importe sous-classe) et en définissant son modèle, comme ceci:

<Window ...> 
    ... 

    <ContentControl> 
    <ContentControl.Template> 
     <ControlTemplate TargetType="{x:Type ContentControl}"> 

     <Grid> 
      ... 
      <ListBox x:Name="ListBox1" ... /> 
      ... 
      <Border x:Name="Border1"> 
      ... 
      </Border> 
     </Grid> 

     <ControlTemplate.Triggers> 
      <Trigger SourceName="ListBox1" Property="ListBox.SelectedIndex" Value="-1"> 
      <Setter TargetName="Border1" Property="UIElement.Visibility" Value="Hidden" /> 
      </Trigger> 
     </ControlTemplate.Triggers> 

     </ControlTemplate> 
    </ContentControl.Template> 

    </ContentControl> 
    ... 
</Window> 

Une meilleure solution serait probablement d'utiliser des contrôles personnalisés. L'utilisation d'une liaison avec un convertisseur est possible mais pas aussi à mon humble avis.

+0

Je reçois l'erreur: Le membre 'SelectedIndex' n'est pas valide car il n'a pas de nom de type qualifiant. –

+0

Étant donné que le déclencheur n'est pas dans ControlTemplate/DataTemplate pour ListBox, il est nécessaire de qualifier le nom de la propriété ('Property =" ListBox.SelectedIndex "'). J'ai mis à jour ma réponse. –

+0

Notez également que le déclencheur doit être utilisé sur votre ControlTemplate/DataTemplate, pas directement sur le ListBox. Si vous n'utilisez pas ControlTemplates, vous pouvez ajouter un contrôle générique contenant un ContentPresenter. –