2015-04-07 3 views
1

У меня есть пользовательский ListBox с несколькими колонками на один пунктПользовательские ListBox в 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> 

То, что я пытаюсь сделать, когда пользователь выбирает элемент, который можно разобрать отдельные значения для этого элемента (UsernameTextBlock, OneCheckbox, TwoCheckBox, ThreeCheckBox).

Я попытался выбрать, который выбрасывает ошибку, и выбор изменен, похоже, работает, но я не знаю, как получить отдельные значения для выбранного элемента.

Любое понимание будет оценено по достоинству.

UPDATE:

Вот код позади

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

    var selectedItem = userListBox.SelectedItem as ListBoxItem; 

    MessageBox.Show(selectedItem.Username); 
} 

В настоящее время я просто показывать сообщение всплывающее окно, чтобы показать, что я доступ к

UPDATE 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

Не могли бы вы оставить код codebehind/ViewModel, который посвящен событию SelectionChanged? – goobering

+0

@goobering Я добавил код позади – Chris

+0

Почти с этим. Можете ли вы опубликовать код, который вы используете, чтобы заполнить ListBox элементами? – goobering

ответ

0

Привязать свойство SelectedItem списка к свойству в вашей модели просмотра. Затем вы получите доступ к элементу, когда он изменит значение в виртуальной машине.

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

Обработчики событий на Loaded и SelectionChanged предполагают, что это скорее имеет файл codebehind, а не ViewModel. – goobering

1

В вашем UserSelected обработчике вы заливка выбранного элемента типа ListBoxItem:

var selectedItem = userListBox.SelectedItem as ListBoxItem; 

Для того, чтобы получить доступ к свойствам, которые вы ищете вам нужно, чтобы бросить его в оригинал типа, который, я считаю, UserItem.

var selectedItem = userListBox.SelectedItem as UserItem; 
+0

Вот и все! Большое спасибо, @goobering – Chris