2009-05-20 5 views
2

J'ai un ComboBox, et je veux changer son apparence quand la propriété ItemsSource est nulle. Quand il est dans cet état, je veux montrer un TextPanel avec le texte "Récupérer des données" dedans, et lui donner un aspect semblable à la zone de texte tatouée. Je suppose que pour ce faire, j'ai besoin d'un ControlTemplate, et un déclencheur. Je ControlTemplate ici:

WPF ComboBox - montrant quelque chose de différent quand aucun élément n'est lié

<ControlTemplate x:Key="LoadingComboTemplate" TargetType="{x:Type ComboBox}"> 
    <Grid> 
     <TextBlock x:Name="textBlock" Opacity="0.345" Text="Retrieving data..." Visibility="Hidden" /> 
    </Grid> 
    <!-- 
    <ControlTemplate.Triggers> 
     <Trigger Property="ComboBox.ItemsSource" Value="0"> 
      <Setter Property="Visibility" Value="Visible" /> 
     </Trigger> 
    </ControlTemplate.Triggers> 
    --> 
</ControlTemplate> 

mais ma question est de savoir comment puis-je configurer le déclencheur pour montrer lorsque la propriété ItemsSource est nulle? J'ai essayé plusieurs manières différentes, et chaque manière m'a donné le message d'erreur "la valeur" ItemsSource "ne peut pas être assignée à la propriété" Property "Invalid PropertyDescriptor la valeur.". Mon XAML ComboBox est ce (y compris la gâchette tentative):

<ComboBox Margin="112,35,80,0" 
     Name="MyComboBox" 
     Height="22.723" 
     VerticalAlignment="Top" 
     DisplayMemberPath="FriendlyName" 
     SelectedValuePath="Path" 
     TabIndex="160" 
     > 
    <Trigger> 
     <Condition Property="ItemsSource" Value="0" /> 
     <Setter Property="Template" Value="{StaticResource LoadingComboTemplate}" /> 
    </Trigger>  
</ComboBox> 

devrait maintenant le déclencheur aller sur le ComboBox, ou sur le ControlTemplate? Comment accéder à la propriété ItemsSource de ComboBox? Devrais-je même utiliser un déclencheur?

Merci!

Répondre

4

Essayez de mettre {x:Null} la valeur de la condition au lieu de 0.

Aussi je l'ai eu de travail en déplaçant le déclencheur à un style et modifing légèrement, voir ci-dessous.

<Style TargetType="ComboBox" x:Key="LoadingComboStyle"> 
    <Style.Triggers> 
     <Trigger Property="ItemsSource" Value="{x:Null}"> 
      <Setter Property="Template" Value="{StaticResource LoadingComboTemplate}" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

<ComboBox Style="{StaticResource LoadingComboStyle}" .... > 

La raison pour laquelle il ne fonctionne que dans un style, est que seulement eventtriggers sont autorisés dans la collection déclencheurs directement sur l'élément cadre. Pour les déclencheurs de propriété (comme ci-dessus), vous devez utiliser un style (j'apprends quelque chose tous les jours).

Voir FrameworkElement.Triggers

Notez que la collection de déclencheurs établis sur un élément ne supporte que EventTrigger, non la propriété des déclencheurs (Trigger). Si vous avez besoin de déclencheurs de propriété, vous devez les placer dans un style ou un modèle, puis affecter ce style ou ce modèle à l'élément soit directement via la propriété Style, soit indirectement via une référence de style implicite.

+0

Merci Ray, travaillé parfaitement. – slugster

Questions connexes