2010-10-26 5 views
1

Comment lier de manière conditionnelle des données à une zone de liste déroulante? J'ai une liste déroulante qui par défaut devrait afficher un ID. Cependant, si l'utilisateur coche une case à cocher, l'affichage devrait afficher à la fois l'identifiant et un nom. Par exemple, "OO1: Sam". J'ai l'identifiant par défaut affiché correctement. Je ne suis pas sûr comment obtenir à la fois l'ID et le nom à afficher en fonction de l'état "IsChecked" de la case à cocher.Comment lier conditionnellement les données?

WPF et C# .Net 3.5

+0

Yo, quelle langue? –

+0

Emettre une liste de valeurs sur le client/ou un tableau. Ajoutez les éléments dans la liste en effectuant une manipulation de chaîne appropriée dans la liste lorsque vous ajoutez les éléments à la liste déroulante. – brumScouse

Répondre

3

Voici une façon, en utilisant un style sur la zone de liste déroulante avec des déclencheurs pour définir le ItemTemplate dynamiquement:

Edit: Modification du style dans une ressource. Notez que ceci est toujours lié directement à la CheckBox en utilisant la liaison d'éléments - si vous voulez qu'elle soit plus flexible, vous pouvez lier la propriété IsChecked de CheckBox à une propriété de votre ViewModel et vous fier à cette modification plutôt qu'à IsChecked.

Avançons le style dans la section Ressources de notre fenêtre:

<Window.Resources> 
    <Style x:Key="myStyle" TargetType="ComboBox"> 
     <Setter Property="ItemTemplate"> 
      <Setter.Value> 
       <DataTemplate> 
        <StackPanel> 
         <TextBlock Text="{Binding Name}" /> 
        </StackPanel> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 

     <Style.Triggers> 
      <DataTrigger Binding="{Binding IsChecked,ElementName=chk}" Value="True"> 
       <Setter Property="ItemTemplate"> 
        <Setter.Value> 
         <DataTemplate> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="{Binding ID}" /> 
           <TextBlock Text=": " /> 
           <TextBlock Text="{Binding Name}" /> 
          </StackPanel> 
         </DataTemplate> 
        </Setter.Value> 
       </Setter> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

Maintenant, nous définissons la case correspondante et un couple de ComboBoxes qui en dépendent:

<CheckBox x:Name="chk" Content="Click Me" /> 

<ComboBox ItemsSource="{Binding}" Style="{StaticResource myStyle}" /> 

<ComboBox ItemsSource="{Binding}" Style="{StaticResource myStyle}" /> 
+0

Matt, merci beaucoup! C'est exactement ce que je cherchais. Bien sûr, je suis sûr que vous pouvez dire que je suis nouveau à WPF. Je savais que ça devait être beaucoup plus facile que la façon dont je m'y prenais. Maintenant, existe-t-il un moyen d'en faire une "StaticResource", pas sûr que ce soit le bon terme. Et comment l'utiliseriez-vous dans une définition de zone de liste déroulante? – GAR8

+0

Envisagez-vous de réutiliser le style sur plusieurs ComboBox, GAR8? Je pourrais éditer la réponse et la changer en ressource si vous aimez - ce n'est pas un grand changement. Si vous ne le réutilisez pas dans plusieurs ComboBox, cela ne vaut pas vraiment la peine d'en faire une ressource à mon humble avis. –

+0

Oui, il y a deux zones de liste déroulante qui seront affectées par cet état de case à cocher unique ainsi que certaines données contenues dans un DataGrid. Je vais également utiliser ce même concept sur une autre case à cocher qui aura un impact sur trois zones de liste déroulante une zone de texte et des données dans le même DataGrid. Avoir une ressource pour minimiser et réutiliser le code serait très utile. Merci beaucoup pour l'aide à ce sujet. G – GAR8

1

Je le ferais en le ViewModel. Vous pouvez avoir un viewmodel pour vos éléments de zone de liste déroulante, un autre pour l'écran sur lequel la case à cocher se trouve, et un moyen pour la case à cocher viewmodel de dire à l'élément viewmodels lorsque sa valeur a changé. L'item viewmodel possède alors une logique conditionnelle dans sa propriété Text (ou peu importe comment vous l'appelez), et implémente le pattern habituel INotifyPropertyChanged pour notifier l'interface utilisateur lorsque son texte a changé.

L'avantage: de cette façon, vous pouvez écrire des tests unitaires pour ce comportement. (Et si ça vaut le coup, ça vaut la peine d'écrire des tests unitaires.)

Questions connexes