从wpf复选框列表中获取所有选定的项目给我错误

时间:2013-06-29 15:24:02

标签: c# wpf wpf-controls

我的ListBox带有复选框,如下所示,它绑定了SQL server database的数据。我想获取所选项目值当我运行此但我收到此错误:

  

无法将类型为“System.Data.DataRowView”的对象强制转换为类型   '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);
 }

我的错误在哪里,谢谢。

1 个答案:

答案 0 :(得分:4)

ListBox.Items在您的XAML(DataTable)中设置为ItemsSource="{Binding Tables[0]}",因此循环遍历ListBox.Items循环遍历DataRowView个对象,而不是CheckBox 1}}对象

您最好的选择是在boolDataContext)添加DataTable列,以便CheckBox.IsChecked绑定到该列。

您还可以使用ItemContainerGenerator生成为数据项生成的XAML项,但这可能不准确,因为默认情况下ListBoxes是虚拟化的,这意味着如果您不绑定值DataContext,不一定保留。

要以正确的方式使用WPF,您真的应该为DataContext

添加一个bool值