使用复选框列自定义DataGrid以选择要输入到表中的行

时间:2012-08-31 18:36:24

标签: c# silverlight datagrid foreach ria

我使用ria和MVVM构建了一个Silverlight应用程序。我创建了一个托管数据网格的ChildWindow。此数据网格当前加载了我的<Book>表。我自定义数据网格以仅返回Book名称,并添加了一个复选框列以选择特定的书。这仅在用户想要多选书籍时弹出。

我的目标是让用户选择他们想要的所有书籍,然后点击保存按钮,将这些书名和ID添加到与我的书表有关系的另一个表中。书籍表格包含书籍和书籍ID列表,第二张表格<JM>应该包含自己的ID和用户选择的所有书籍。因此,稍后,当用户想要搜索他们的书籍时,他们可以呼叫书籍或多个书籍选择,并且它将返回他们选择的所有书籍。简单的东西。

但是,我目前无法在表格中添加多本书籍。由于我的选择项代码,只输入了一本书。

JobMarket jm = new JobMarket();
foreach (Book b in dataGrid1.SelectedItems)
{
    dataGrid1.SelectedItems.Add(b);
    jm.BookID = b.BookID;
    jm.Book = b.Book1;
}
_context.JobMarkets.Add(jm);
SubmitOperation s = _context.SubmitChanges();

this.DialogResult = true;

我是这样尝试的,因为我认为selectedItems会返回所有的selectedItems,但它目前只是最后一个选中的项目。由于我的复选框控件嵌套在datagrid中,我无法通过codebehind访问它。我知道有一种方法,我只是不知道该怎么做。我认为foreach会遍历并找到复选框,但事实并非如此。

所以我正在寻找一种解决方法,并在这一次点击事件中完成所有操作。有没有一种简单的方法在代码后面使用类似于我自己的代码(我的理解水平) 这也是xaml数据网格。

<sdk:DataGrid AutoGenerateColumns="False" Height="532" HorizontalAlignment="Left" Name="dataGrid1" VerticalAlignment="Top" >
    <sdk:DataGrid.Columns>
        <sdk:DataGridTemplateColumn Header="Add Book">
            <sdk:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="chkAddBook" IsChecked="{Binding Book1, Mode=TwoWay}" />
                </DataTemplate>
            </sdk:DataGridTemplateColumn.CellTemplate>
        </sdk:DataGridTemplateColumn>
        <sdk:DataGridTemplateColumn Header="Book">
            <sdk:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Book1}" HorizontalAlignment="Center" VerticalAlignment="Center" Padding="12,3"  />
                </DataTemplate>
            </sdk:DataGridTemplateColumn.CellTemplate>
        </sdk:DataGridTemplateColumn>
    </sdk:DataGrid.Columns>
</sdk:DataGrid>

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望获得用户检查过的所有书籍。

您可以将Bool属性IsChecked添加到Book类,并在Datagridcheckboxcolumn中创建与它的双向绑定。所以稍后你可以选择托运书籍。

如果您不想使用此属性扩展Book类,则可以使用required属性为该书创建包装器,创建这些包装器的集合并将其绑定到DataGrid。

<DataGrid ItemsSource="{Binding MyBooksCollection}">
    <DataGrid.Columns>
        <DataGridCheckBoxColumn Binding="{Binding Path=IsChecked, Mode=TwoWay}" />
    </DataGrid.Columns>
</DataGrid>

MyBooks集合应包含具有IsChecked属性的对象。