2010-11-28 7 views
9

Supposons que je souhaite afficher/masquer des éléments basés sur les valeurs de propriétés de DataContext, comment puis-je l'obtenir?Déclencheurs basés sur des propriétés de DataContext

// In MainWindow.xaml.cs: DataContext of MainWindow.xaml 
public int Mode { get; set; } 

En XAML, je veux montrer des éléments masquer en fonction de la Mode. Comment puis-je faire le travail ci-dessous? Ou quelle est la manière appropriée de mettre en œuvre ceci?

<StackPanel> 
    <StackPanel.Triggers> 
     <Trigger Property="Mode" Value="1"> 
      <Setter TargetName="txt1" Property="Visibility" Value="Visible" /> 
      <Setter TargetName="txt2" Property="Visibility" Value="Collapsed" /> 
      <Setter TargetName="txt3" Property="Visibility" Value="Visible" /> 
     </Trigger> 
     <Trigger Property="Mode" Value="2"> 
      <Setter TargetName="txt1" Property="Visibility" Value="Collapsed" /> 
      <Setter TargetName="txt2" Property="Visibility" Value="Visible" /> 
      <Setter TargetName="txt3" Property="Visibility" Value="Collapsed" /> 
     </Trigger> 
    </StackPanel.Triggers> 
    <TextBlock Text="TextBlock 1" x:Name="txt1" /> 
    <TextBlock Text="TextBlock 2" x:Name="txt2" /> 
    <TextBlock Text="TextBlock 3" x:Name="txt3" /> 
</StackPanel> 

Actuellement, l'erreur que je reçois est "propriété 'Mode' n'a pas été trouvé dans le type 'StackPanel' D:. \ Tmp \ WpfApplication1 \ TriggersAndProperties \ MainWindow.xaml"

Répondre

10

vous devez utiliser DataTriggers si vous voulez les déclencheurs qui peuvent travailler sur les liaisons. Le problème est, DataTriggers ne sont disponibles que sur le style et le modèle de sorte que vous devez définir un comme ceci:

<StackPanel> 
    <StackPanel.Style> 
    <Style TargetType="{x:Type StackPanel}"> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=Mode}" Value="1"> 
      <Setter TargetName="txt1" Property="Visibility" Value="Visible" /> 
      <Setter TargetName="txt2" Property="Visibility" Value="Collapsed" /> 
      <Setter TargetName="txt3" Property="Visibility" Value="Visible" /> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Path=Mode}" Value="2"> 
      <Setter TargetName="txt1" Property="Visibility" Value="Collapsed" /> 
      <Setter TargetName="txt2" Property="Visibility" Value="Visible" /> 
      <Setter TargetName="txt3" Property="Visibility" Value="Collapsed" /> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </StackPanel.Style> 
    <TextBlock Text="TextBlock 1" x:Name="txt1" /> 
    <TextBlock Text="TextBlock 2" x:Name="txt2" /> 
    <TextBlock Text="TextBlock 3" x:Name="txt3" /> 
</StackPanel> 

Une autre solution serait d'utiliser un IValueConverter qui convertit l'int de Mode à la Visibility que vous voulez, et l'appliquer directement à chaque propriété Visibility du bloc de texte.

Notez que la réponse de Dean Chalk reste valide: vous devez utiliser un DependencyProperty ou implémenter INotifyPropertyChanged si vous souhaitez que les modifications sur Mode se déclenchent. Que se passe-t-il si j'ai un multitrigger où une condition est un datatrigger?

+0

Erreur de compilation obtenue MC4011: La propriété TargetName ne peut pas être définie sur un sélecteur de style – Lu55

+0

Votre exemple ne fonctionne pas. "Le nom 'txt1' n'est pas reconnu. – FINDarkside

1

Votre propert « mode » doit être une propriété de dépendance pour être utilisé de cette façon:

public class MainViewModel : DependencyObject 
{ 
    readonly DependencyProperty ModeProperty = DependencyProperty 
     .Register("Mode", typeof(int), typeof(MainViewModel)); 

    public int Mode 
    { 
     get { return (int) GetValue(ModeProperty); } 
     set { SetValue(ModeProperty, value); } 
    } 
} 
+0

et était une propriété ui-élément? –

Questions connexes