【问题标题】:Custom DataGrid using checkbox column to select rows to enter into table自定义 DataGrid 使用复选框列选择要输入表的行
【发布时间】:2012-08-31 18:36:24
【问题描述】:

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

我的目标是让用户选择他们想要的所有书籍,然后点击保存按钮,将这些书籍名称和 ID 添加到与我的书籍表有关系的另一个表中。 book 表保存书籍列表和书籍 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,但它目前只是最后一个选定的项目。由于我的复选框控件嵌套在数据网格中,因此我无法通过代码隐藏访问它。我知道有办法,只是不知道怎么做。我以为 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>

【问题讨论】:

  • “选择”是什么意思?只是检查框或行选择?
  • 是的,抱歉,选中与同一行中的书对应的框。

标签: c# silverlight datagrid foreach ria


【解决方案1】:

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

您可以将布尔属性 IsChecked 添加到 Book 类,并在 Datagridcheckboxcolumn 中创建两种方式绑定到它。所以稍后您可以选择已选中的书籍。

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

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

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

【讨论】:

  • 您的意思是将 bool 属性添加到表中还是添加到调用表的 ria 服务中?第一个选项听起来更好,我对 wrappers/create collection 不太熟悉
  • 我的意思是将 bool 属性添加到存储在绑定到数据网格的集合中的对象中。
  • 我已经将复选框本身绑定到 book 表,因此它显示在我的 SelectedItems 属性中。但是当我尝试将它与对象匹配时,没有任何属性是可行的。有代码示例吗?
  • 我不知道我今天怎么了,我在创建这个集合时遇到了很多麻烦,还有其他隐藏的例子吗?
  • 您的 DataGrid 以某种方式获取数据。这些数据来自哪里?在 MVVM 中,视图通过绑定填充数据。当谈到 DataGrid 时,我们应该首先告诉它要使用哪个集合(绑定到 ItemsSourse),然后为 Columns 提供绑定。稍后的绑定将应用于每个集合的项目。您只需在 ViewModel 中创建一些名为 MyCollection 的属性,例如 IEnumerable 类型。
猜你喜欢
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多