2010-05-14 3 views
0

Пробовал выяснять, как я могу захватить события из списка. В шаблоне я добавил параметр IsChecked = "", который запускает мой метод. Однако проблема заключается в попытке захватить то, что было проверено в методе. SelectedItem возвращает только то, что выбрано в данный момент, а не флажок.Захват списка флажков WPF

object selected = thelistbox.SelectedItem; 
DataRow row = ((DataRowView)selected).Row; 
string teststring = row.ItemArray[0].ToString(); // Doesn't return the checkbox! 

<ListBox IsSynchronizedWithCurrentItem="True" Name="thelistbox" ItemsSource="{Binding mybinding}"> 
    <ListBox.ItemTemplate> 
      <DataTemplate> 
        <StackPanel> 
          <CheckBox Content="{Binding personname}" Checked="CheckBox_Checked" Name="thecheckbox"/> 
         </StackPanel> 
       </DataTemplate> 
     </ListBox.ItemTemplate> 
</ListBox> 

ответ

1

В идеале вы должны BIND IsChecked свойству на вашей строке т.е.

<CheckBox Content="{Binding personname}" IsChecked="{Binding IsPersonChecked}" Name="thecheckbox"/> 

где "IsPersonChecked" является столбец в вашем DataTable (или что вы свяжете с), так же, как "PersonName". Тогда вы можете прочитать ли проверяются непосредственно из переменной DataRow:

DataRow row = ((DataRowView)thelistbox.SelectedValue).Row; 
bool isPersonChecked = (bool) row["IsPersonChecked"]; 

Если DataSet набран, вы хотите использовать типизированные свойства DataRow, очевидно.

Обратите внимание, что я использовал свойство SelectedValue, а не SelectedItem. Я считаю, что SelectedItem на самом деле является экземпляром ListBoxItem. Что вы можете использовать, если хотите оставить свой IsChecked unbound. Тогда вам нужно будет вернуть CheckBox с учетом полной иерархии шаблонов. Что-то вроде:

bool isChecked = ((CheckBox)((StackPanel) ((ListBoxItem) thelistbox.SelectedItem).Content).Children[0]).IsChecked ?? false; 

Беспокойство. (. Debug и настроить иерархию к тому, что вы на самом деле получить код обыкновение работать, вероятно, как есть.)

Лучше подход заключается в использовании RoutedEventArgs вашего обработчика CheckBox_Checked:

private void CheckBox_Checked(object sender, RoutedEventArgs e) 
{ 
    CheckBox checkBox = (CheckBox) e.Source; 
    DataRow row = ((DataRowView) checkBox.DataContext).Row; 
    bool isChecked = checkBox.IsChecked ?? false; 
} 
+0

Спасибо за это! Последний подход работает красиво. Мы подумали об использовании второго способа, который вы указали, однако мой интерфейс все еще находится в состоянии изменения. – wonea

Смежные вопросы