我的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);
}
我的错误在哪里,谢谢。
答案 0 :(得分:4)
ListBox.Items
在您的XAML(DataTable
)中设置为ItemsSource="{Binding Tables[0]}"
,因此循环遍历ListBox.Items
循环遍历DataRowView
个对象,而不是CheckBox
1}}对象
您最好的选择是在bool
(DataContext
)添加DataTable
列,以便CheckBox.IsChecked
绑定到该列。
您还可以使用ItemContainerGenerator生成为数据项生成的XAML项,但这可能不准确,因为默认情况下ListBoxes
是虚拟化的,这意味着如果您不绑定值DataContext
,不一定保留。
要以正确的方式使用WPF,您真的应该为DataContext