2011-06-09 4 views
0

J'utilise des modèles de données pour définir les valeurs de cases à cocher dans une liste déroulante en tant que tel:WPF Obtenir contenu CheckBox

<ComboBox Margin="118,117,163,164" ItemsSource="{Binding collection}"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <CheckBox Content="{Binding Name}"/> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 

Cela fonctionne comme il se doit. Mon problème est que lorsque l'utilisateur coche la case, je dois pouvoir récupérer la valeur du contenu dans la case à cocher. Est-ce possible?

Merci.

+0

Que voulez-vous dire par "obtenir la valeur du contenu stocké dans la case"? – Osiris76

+0

Je suppose que vous voulez dire que vous avez besoin de tous les noms que l'utilisateur a coché/sélectionné. – Gishu

+0

La valeur textuelle d'une case à cocher est stockée en tant que contenu. –

Répondre

2

La propriété IsChecked de Checkbox doit être liée à une autre propriété de l'objet de support pour chaque élément. c'est-à-dire que le type qui a le nom devrait exposer une propriété booléenne IsSelected.

La liaison de données mettra à jour la propriété IsSelected de manière appropriée, ce qui vous facilitera l'accès au code. par exemple. vous pouvez parcourir la liste et filtrer tous les éléments qui ont IsSelected = false.

Exemple de code

XAML

<StackPanel> 
     <ComboBox ItemsSource="{Binding Items}"> 
      <ComboBox.ItemTemplate> 
       <DataTemplate> 
        <CheckBox Content="{Binding Name}" IsChecked="{Binding IsSelected}"/> 
       </DataTemplate> 
      </ComboBox.ItemTemplate> 
     </ComboBox> 
     <Button Click="EvaluateSelectedItems">Show Selected</Button> 
     <TextBlock>Selected Items</TextBlock> 
     <ListBox ItemsSource="{Binding SelectedItems}" DisplayMemberPath="Name" Background="AliceBlue"/> 
    </StackPanel> 

code-behind

public MainWindow() 
{ 
    InitializeComponent(); 
    this.DataContext = this; 

    Items = new List<ItemVM> 
       { 
        new ItemVM {IsSelected = false, Name = "Firefox"}, 
        new ItemVM {IsSelected = false, Name = "Chrome"}, 
        new ItemVM {IsSelected = false, Name = "IE"} 
       }; 
} 

public IEnumerable<ItemVM> Items { get; set; } 
private IEnumerable<ItemVM> _selectedItems; 
public IEnumerable<ItemVM> SelectedItems 
{ 
    get { return _selectedItems; } 
    set 
    { 
     _selectedItems = value; 
     if (PropertyChanged != null) 
      this.PropertyChanged(this, new PropertyChangedEventArgs("SelectedItems")); 
    } 
} 

private void EvaluateSelectedItems(object sender, RoutedEventArgs e) 
{ 
    SelectedItems = Items.Where(item => item.IsSelected); 
} 
+0

Ne me permet pas d'utiliser la liaison sur la propriété Checked car elle indique qu'elle nécessite un événement –

+1

Le nom de la propriété est IsChecked, l'événement sélectionné est Checked. –

+0

@Darren - ouais juste glissé sur celui-là .. La propriété que vous voulez lier est IsChecked la propriété booléenne sur une case à cocher. Mise à jour .. – Gishu