0

次のよう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);
 }

私のエラーはどこにありますか、ありがとう。

4

1 に答える 1

4

ListBox.ItemsDataTableはXAML ( ItemsSource="{Binding Tables[0]}") でa に設定されているため、ループスルーListBox.ItemsDataRowViewオブジェクトではなくオブジェクトCheckBoxをループします。

最善の策は、 (the )boolに列を追加して、それにバインドできるようにすることです。DataContextDataTableCheckBox.IsChecked

ItemContainerGeneratorを使用して、データ項目用に生成された XAML 項目を生成することもできListBoxesますが、既定で仮想化されているため、これは正確ではない可能性があります。つまり、値を にバインドしないと、DataContext保持されるとは限りません。

WPF を正しく使用するには、bool 値をDataContext

于 2013-06-29T15:58:55.300 に答える