2013-06-29 2 views
0

У меня есть ListBox с отмеченным ящиком, как указано ниже, и привязывает его данные от SQL server database. Я хочу, чтобы получить выбранное значение пунктов Когда я запускаю это, но я получил эту ошибку:все выбранные элементы из списка checkbox wpf дайте мне ошибку

Unable to cast object of type 'System.Data.DataRowView' to type 'System.Windows.Controls.CheckBox'.

Это код:

<Window.Resources> 
    <DataTemplate x:Key="NameColumnTemplate"> 
     <CheckBox Height="20" FontFamily="Arial" FontSize="14" Content="{Binding Path=PermissionDescription}" Tag="{Binding PermissionID}" HorizontalAlignment="Stretch" VerticalAlignment="Center" /> 
    </DataTemplate> 
</Window.Resources> 

<Grid> 
    <ListBox HorizontalAlignment="Stretch" Margin="12,12,136,21" Name="lstEmployees" 
     VerticalAlignment="Stretch" ItemsSource="{Binding Tables[0]}" 
     ItemTemplate="{StaticResource NameColumnTemplate}" 
     ScrollViewer.VerticalScrollBarVisibility="Auto" removed="{x:Null}" 
     BorderBrush="#FFAD7F30" 
     SelectionChanged="lst_SelectionChanged" CheckBox.Click="lst_SelectionChanged"/> 

    <Button Content="listbox" Height="23" HorizontalAlignment="Left" Margin="214,207,0,0" Name="btnShowSelectedItems" VerticalAlignment="Top" Width="75" Click="btnShowSelectedItems_Click" /> 
</Grid> 

public Window2() 
{ 
    InitializeComponent(); 
    // bind data 
    lstEmployees.DataContext = SelJobsCat(); 
} 

private void btnShowSelectedItems_Click(object sender, RoutedEventArgs e) 
{ 
    foreach (CheckBox item in lstEmployees.Items) 
    { 
     if (item.IsChecked == true) 
     { 
      System.Windows.MessageBox.Show((item.Content + " is checked.")); 
     } 
    } 
} 

private void lst_SelectionChanged(object sender, RoutedEventArgs e) 
{ 
    if (e.OriginalSource is CheckBox) 
    { 
     lstEmployees.SelectedItem = e.OriginalSource; 
    } 

    if (lstEmployees.SelectedItem == null) return; 

    Console.WriteLine(lstEmployees.SelectedIndex); 
    Console.WriteLine(((CheckBox)lstEmployees.SelectedItem).IsChecked); 
} 

Где моя ошибка, пожалуйста, спасибо.

ответ

4

ListBox.Items устанавливается в DataTable в вашем XAML (ItemsSource="{Binding Tables[0]}"), поэтому цикл через ListBox.Items цикл по DataRowView объектов, а не CheckBox объектов

Лучше всего добавить bool столбец в DataContext (DataTable), поэтому вы можете связать с ним CheckBox.IsChecked.

Вы также можете использовать ItemContainerGenerator для создания элемента XAML, сгенерированный для элемента данных, однако это не может быть точным, поскольку ListBoxes виртуализированы по умолчанию, что означает, что если вы не связать значение с DataContext, он выиграл Не обязательно.

Для работы с WPF правильный путь, вы действительно должны добавить булево значение в DataContext

+0

Большое спасибо Рейчел, я добавить столбец Ьоо к моей DataContext, и в настоящее время свою работу отлично. –

+0

@Rachel Если вы хороши в WPf, тогда plz попытается дать мне решение по этому вопросу http://stackoverflow.com/questions/17402056/how-to-use-grid-inside-grid-nested-grid-on- DevExpress-инструментов-в-МОФ – Rahul