2015-04-07 2 views
1

J'ai un ListBox personnalisé avec plusieurs colonnes par un articlesélection ListBox personnalisé dans WPF

<ListBox Name="UserListBox" Loaded="GetUsers_OnLoad" SelectionChanged="UserSelected"> 
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <DockPanel Name="UserDockPanel" Margin="4"> 
      <TextBlock Name="UsernameTextBlock" Text="{Binding Path=Username}"/> 
      <CheckBox Name="OneCheckBox" IsHitTestVisible="False" IsChecked="{Binding One}" /> 
      <CheckBox Name="TwoCheckBox" IsHitTestVisible="False" IsChecked="{Binding Two}" /> 
      <CheckBox Name="ThreeCheckBox" IsHitTestVisible="False" IsChecked="{Binding Three}" /> 
     </DockPanel> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

Ce que je suis en train de faire est lorsque l'utilisateur sélectionne un élément que je peux analyser les valeurs individuelles pour cet article (UsernameTextBlock, OneCheckbox, TwoCheckBox, ThreeCheckBox).

J'ai essayé sélectionné qui génère une erreur et la sélection modifiée semble fonctionner mais je ne sais pas comment récupérer les valeurs individuelles pour l'élément sélectionné.

Tout aperçu serait apprécié.

MISE À JOUR:

Voici le code derrière

private void UserSelected(object sender, RoutedEventArgs e) 
{ 
    var userListBox = FindName("UserListBox") as ListBox; 

    var selectedItem = userListBox.SelectedItem as ListBoxItem; 

    MessageBox.Show(selectedItem.Username); 
} 

Je suis actuellement juste montrer un popup de message pour montrer ce que j'accède

MISE À JOUR 2:

private void GetUsers_OnLoad(object sender, RoutedEventArgs e) 
{ 
    _outreachAuths = _outreachTableAdapter.GetOutreachAuths(); 

    var users = new List<UserItem>(); 

    foreach (DataRow row in _outreachAuths.Rows) 
    { 
     users.Add(new UserItem() { Username = row.ItemArray[0].ToString(), One = false, Two = true, Three = ((row.ItemArray[2].ToString() == "1"))}); 
    } 

    var userList = sender as ListBox; 
    if (userList != null) userList.ItemsSource = users; 
} 
+0

Pourriez-vous s'il vous plaît publier le code codebehind/ViewModel qui traite de l'événement SelectionChanged? – goobering

+0

@goobering J'ai ajouté le code derrière – Chris

+0

Près de là avec celui-ci. Pouvez-vous s'il vous plaît poster le code que vous utilisez pour remplir le ListBox avec des éléments? – goobering

Répondre

0

Liez la propriété SelectedItem de la liste à une propriété dans votre modèle de vue. Vous aurez alors accès à l'élément quand il s'agit de changements de valeur dans la machine virtuelle.

<ListBox Name="UserListBox" Loaded="GetUsers_OnLoad" SelectionChanged="UserSelected" SelectedItem={Binding Path=PropertyOnViewModel}> 
+0

Les gestionnaires d'événements sur Loaded et SelectionChanged suggèrent que cela est plus susceptible d'avoir un fichier codebehind plutôt qu'un ViewModel. – goobering

1

Dans votre gestionnaire vous êtes sélectionné par l'utilisateur casting l'élément sélectionné à taper ListBoxItem:

var selectedItem = userListBox.SelectedItem as ListBoxItem; 

Pour accéder aux propriétés que vous recherchez, vous aurez besoin de le jeter à son origine type qui est, je crois, UserItem.

var selectedItem = userListBox.SelectedItem as UserItem; 
+0

Ça l'a fait! Merci beaucoup, @goobering – Chris