【问题标题】:how to get muliplte checked datagrid checkbox items with MVVM如何使用 MVVM 获取多个选中的数据网格复选框项目
【发布时间】:2014-08-23 03:37:01
【问题描述】:

我有由多个数据网格复选框组成的数据网格,我想获取数据网格选中的项目,我只能获取单个选定的行项目,但我需要选中复选框的集合,下面我正在使用的代码。请让我知道如何解决这个问题

**Xaml*****

<DataGrid SelectedItem="{Binding SelectedRow, Mode=TwoWay}" ItemsSource="{Binding ManualDataTable}"   Background="{Binding ElementName=gd,Path=Background}">
<DataGrid.Columns>
<DataGridCheckBoxColumn Binding="{Binding UserID}" Width="60" />
<DataGridTextColumn   Binding="{Binding Name}" Width="140" Header="Name"  FontSize="16" FontFamily="segoe_uilight" IsReadOnly="True" />
 </DataGrid.Columns>
             </DataGrid>

<Button BorderBrush="{x:Null}"   Content="Add participants"  Width="220" Height="50"  FontSize="20" Command="{Binding SaveAssignedUser}"/>

*****查看模型***********

DataTable _manualDataTable;
        public DataTable ManualDataTable
        {
            get
            {
                return _manualDataTable;
            }
            set
            {
                _manualDataTable = value;
                RaisePropertyChanged("ManualDataTable");
            }
        }
       private List<DataRowView> selectedRow;
       public List<DataRowView> SelectedRow
        {
            get
            {
                return selectedRow;
            }
            set
            {
                selectedRow = value;
                RaisePropertyChanged(() => SelectedRow);
            }
        }


 public void ExecuteSaveAssignedUser()
 {
 SelectedRow = new List<DataRowView>();**///need multiple checked checkboxes collection**
foreach (DataRowView drv in SelectedRow)
 {
  }
 }

【问题讨论】:

  • 您的 DataGridCheckBoxColumn 绑定到 UserID 属性,我假设它是您的 DataTable 中的一列。当您选中和取消选中这些框时,此列值应该更新为 true/false。在您的 ExecuteSaveAssignedUser() 方法中,您应该能够遍历 DataTable 中的行并检查 UserID 的值以确定它是否已在该行中检查。
  • @AndrewStephens 正是我需要的是数据网格项目。但是我怎样才能在这里获得数据网格项目?你能提供一个代码行示例会有所帮助吗?而且在选定的行中它只给出一个项目我需要收藏

标签: wpf mvvm checkbox datagrid


【解决方案1】:

您的复选框列绑定到一个名为UserID 的属性,我猜它是您的DataTable 中列的名称。每当您选中/取消选中数据网格中的复选框时,绑定都会在 DataTable 的相关 DataRow 中将 UserID 的值更改为 true 或 false。

为什么要将复选框列绑定到用户 ID?我怀疑这不是你真正想要的。相反,您可能需要向 DataTable 添加一个布尔列(例如IsSelected),然后将您的复选框列绑定到该列

看起来您正在使用 MVVM,因此无法从您的视图模型中访问数据网格项目。您只能访问网格绑定到的数据(即您的 DataTable)。您的视图模型代码需要遍历此 DataTable 中的行,检查 UserID 列的值(或“IsSelected”列,如果您添加一个!)以确定该行的复选框是否在数据网格中被选中。

您绑定的SelectedItem 属性与您的复选框列完全无关。选中和取消选中这些对SelectedItem 没有影响。此属性用于确定用户使用鼠标选择了哪一行(这使该行具有不同的 b/g 颜色)。忘记这个属性吧——它与你想要做的事情无关。

正如在其他地方已经提到的,在 WPF 中尽量避免使用 DataTables。相反,定义某种“用户”类,并让您的视图模型公开这些集合以供您的网格绑定。

【讨论】:

  • 实际上我是 MVVM 的初学者,这就是为什么我知道这种方式我直接绑定用户 ID,而无需制作任何模板,我在其中使用复选框控件并按照您的建议使用 ISelected 但随着知识的增长将使用正确的方式。感谢您的建议
【解决方案2】:

您似乎遗漏了数据绑定的全部要点……也就是说,可以从您后面的代码访问您的DataGrid 中显示的所有数据。您已将ManualDataTable DataTable 属性绑定到DataGrid,因此绑定到RadioButton 控件的数据值都在DataTable 的一列中。

因此,访问它们所需要做的就是查看您的DataTable。有几种方法可以实现这一点,但这里有一种:

foreach(DataRow row in ManualDataTable.Rows)
{
    if (row[requiredColumnIndex] == true) AddRowToSomeCollection(row);
}

但是,如果您打算继续使用 WPF,我强烈建议您停止使用这些旧类,例如 DataTables。通常在 WPF 中,我们定义自定义类,从长远来看,这会使一切变得更加简单。

【讨论】:

  • 实际上我最初使用的是 observablecollection,但后来我尝试了这种方式,即使用数据表属性。请提出任何我可以改进的链接或代码。
猜你喜欢
  • 2017-03-29
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 2020-02-14
  • 2011-03-03
  • 1970-01-01
相关资源
最近更新 更多