SelectAll In Datagrid

时间:2014-01-25 21:46:40

标签: wpf wpfdatagrid

我在仅使用XAML的数据网格中为SelectAll Checkbox发现了一个很好的解决方案:

<DataGrid x:Name="TestGrid" Tag="false">
   <DataGrid.Resources> 
       <DataTemplate x:Key="HeaderCheckbox">
           <CheckBox Name="SelectAll" IsChecked="{Binding RelativeSource={RelativeSource  Mode=FindAncestor, AncestorType=DataGrid}, Path=Tag, Mode=TwoWay}" /> 
       </DataTemplate>    
       <DataTemplate x:Key="ItemCheckbox"> 
           <CheckBox IsChecked="{Binding RelativeSource={RelativeSource  Mode=FindAncestor, AncestorType=DataGrid}, Path=Tag, Mode=OneWay}" /> 
       </DataTemplate> 
   </DataGrid.Resources> 
   <DataGrid.Columns> 
       <DataGridTemplateColumn HeaderTemplate="{StaticResource HeaderCheckbox}" CellTemplate="{StaticResource ItemCheckbox}" /> 
       <DataGridTextColumn Binding="{Binding FirstName}" /> 
   </DataGrid.Columns> 
 </DataGrid>

来源:Complete XAML Solution For SelectAll In Datagrid

但这是我的问题......在上面的示例中, ItemCheckbox 绑定到Datagrid的标记属性,然后如何将ItemCheckbox绑定到我的数据字段包含

1 个答案:

答案 0 :(得分:1)

最简单的解决方案我可以看到它在视图模型中使用属性而不是Tag。保持项目的第一个类创建SelectAll属性,该属性将在更改时相应地更新所有项目:

public class MyItemCollection : INotifyPropertyChanged 
{
    private readonly ObservableCollection<MyItem> _items;

    public ICollection<MyItem> Items { get { return _items; } }

    private bool _selectAll;

    public bool SelectAll
    {
        get { return _selectAll; }
        set
        {
            if (_selectAll != value)
            {
                _selectAll = value;
                OnPropertyChanged("SelectAll");
                foreach (var item in _items) item.IsSelected = value;
            }
        }
    }
}

然后将IsSelected属性添加到您的项目中。它将由SelectAll属性或CheckBox

中的DataGrid进行更新
public class MyItem : INotifyPropertyChanged 
{
    private bool _isSelected;

    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            if (_isSelected != value)
            {
                _isSelected = value;
                OnPropertyChanged("IsSelected");
            }
        }
    }
}

然后更新绑定以指向新属性:

<DataGrid x:Name="TestGrid" ItemsSource="{Binding Items}">
   <DataGrid.Resources>
      <DataTemplate x:Key="HeaderCheckbox">
         <CheckBox Name="SelectAll" IsChecked="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=DataContext.SelectAll}" />
      </DataTemplate>
      <DataTemplate x:Key="ItemCheckbox">
         <CheckBox IsChecked="{Binding Path=IsSelected}" />
      </DataTemplate>
   </DataGrid.Resources>

</DataGrid>