如何使用MVVM获取多个已检查的datagrid复选框项

时间:2014-07-02 11:05:57

标签: wpf mvvm checkbox datagrid

我有datagrid,它包含多个数据网格复选框,我想获取datagrid检查的项目,我只能获得单个选定的行项目,但我需要收集已选中的复选框,在我正在使用的代码下面。请让我知道如何解决这个问题

** *****的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)
 {
  }
 }

2 个答案:

答案 0 :(得分:2)

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

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

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

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

正如其他地方已经提到的那样,尝试避免使用WPF中的DataTables。相反,定义某种“用户”类,让你的视图模型为你的网格公开这些类的集合。

答案 1 :(得分:1)

您似乎错过了数据绑定的全部内容......即可以访问代码中DataGrid中显示的所有数据。您已将ManualDataTable DataTable属性绑定到DataGrid,因此绑定到RadioButton控件的数据值全部位于DataTable的一列中。

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

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

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

相关问题