2014-01-25 27 views
0

我發現全選複選框在DataGrid中使用XAML只是一個很好的解決方案:全選DataGrid中

<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綁定到我的數據字段包括

+0

CheckBox'你想要哪個'綁定?在標題中,針對項目還是兩者? – dkozl

+0

@dkozl我想綁定ItemCheckbox –

+0

您是否建議您將HeaderCheckbox和ItemCheckbox都綁定到ViewModel中的屬性?或者你是否想將ItemCheckbox綁定到Item上的屬性,但是希望HeaderCheckbox也切換該值? –

回答

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屬性添加到您的項目。它要麼通過DataGrid

public class MyItem : INotifyPropertyChanged 
{ 
    private bool _isSelected; 

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

然後SelectAll財產或CheckBox更新更新您的結合,使其指向新的屬性:

<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>