2012-02-29 9 views
6

私はWPFデータグリッドを使用しています。データグリッドのユーザーには、列ヘッダーと行ヘッダーがあります。Select Allのイベント:WPF Datagrid

両方の列ヘッダーと行ヘッダーが表示されている場合、左上隅に1つの小さな四角形セクションがあります。 (列ヘッダーと行ヘッダーが交差する左上隅の断面図)をクリックすると、データグリッド内のすべてのセルが選択されます。それのためのイベントはありますか?もしそうでなければ、そのイベントをトラップできます。私を案内してください。

この問題に関するその他の情報が必要な場合はお知らせください。

よろしく、 Priyank

答えて

12
内の項目の数に等しいかどうかを確認することができます

DataGridは、ルーティングされたコマンドApplicationCommand.SelectAllを処理します。グリッドにフォーカスがあり、Ctrl-Aを押すか、またはコーナーボタンをクリックすると、すべてのセルが選択されます。 あなたは、XAMLでいるCommandBindingを追加することで、このコマンドを自分で処理できます

<DataGrid x:Name="dataGrid" .../> 
    <DataGrid.CommandBindings> 
     <CommandBinding Command="ApplicationCommands.SelectAll" Executed="SelectAll_Executed"/> 
    </DataGrid.CommandBindings> 

それとも、コード内で結合コマンドを追加することができます。

public MyControl(){ 
    InitializeComponent(); 
    ... 
    dataGrid.CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, SelectAll_Executed)); 
} 

しかし、唯一のルーティングされたため、単一のハンドラがあることができこのハンドラを追加すると、select allがデータグリッド内で動作しなくなります。 ハンドラでは、SelectAllを呼び出す必要があります。

private void SelectAll_Executed(object sender, ExecutedRoutedEventArgs e) 
{ 
    Debug.WriteLine("Executed"); 
    dataGrid.SelectAll(); 
} 
0

それはかなり良い解決策はありませんが、「SelectionChanged」などのイベントを処理し、選択した項目の数は、データソース

0

私はビューでの背後にあるコードの使用を避けることを好むので、私はそれをこのようにやった: enter image description here

enter image description here

それはすべての選択/非選択し、左上隅にチェックボックスであります。添付プロパティと特別XAML構造:

1)

溶液を2つの部分から構築されます。添付プロパティ:

public class DataGridSelectAllBehavior 
{ 
    public static bool GetValue(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(ValueProperty); 
    } 

    public static void SetValue(DependencyObject obj, bool value) 
    { 
     obj.SetValue(ValueProperty, value); 
    } 
    public static readonly DependencyProperty ValueProperty = 
     DependencyProperty.RegisterAttached("Value", typeof(bool), typeof(DataGridSelectAllBehavior), new PropertyMetadata(false, 
      (o, e) => 
      { 
       var dg = DataGridSelectAllBehavior.GetDataGrid(o); 
       CheckBox checkBox = o as CheckBox; 

       if (checkBox.IsChecked == true) 
       { 
        dg.SelectAll(); 
       } 
       else 
       { 
        dg.UnselectAll(); 
       } 

      })); 


    public static DataGrid GetDataGrid(DependencyObject obj) 
    { 
     return (DataGrid)obj.GetValue(DataGridProperty); 
    } 

    public static void SetDataGrid(DependencyObject obj, DataGrid value) 
    { 
     obj.SetValue(DataGridProperty, value); 
    } 

    public static readonly DependencyProperty DataGridProperty = 
     DependencyProperty.RegisterAttached("DataGrid", typeof(DataGrid), typeof(DataGridSelectAllBehavior), new PropertyMetadata(null)); 

} 

2)XAML:

<DataGrid ItemsSource="{Binding PendingChanges}" 
      AutoGenerateColumns="False" 
      IsReadOnly="True" 
      SelectionMode="Extended"> 
    <i:Interaction.Behaviors> 
     <behaviors:MultiSelectGridSelectedItemsBehavior SelectedItems="{Binding SelectedPendingChanges, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" /> 
    </i:Interaction.Behaviors> 
    <DataGrid.Columns> 
     <DataGridCheckBoxColumn Binding="{Binding Path=IsSelected,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridRow}}}"> 
      <DataGridCheckBoxColumn.HeaderTemplate> 
       <DataTemplate> 
        <CheckBox 
           behaviors:DataGridSelectAllBehavior.Value="{Binding IsChecked,RelativeSource={RelativeSource Self}}" 
           behaviors:DataGridSelectAllBehavior.DataGrid="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}}}"/> 
       </DataTemplate> 
      </DataGridCheckBoxColumn.HeaderTemplate> 
     </DataGridCheckBoxColumn> 
     <DataGridTextColumn Header="Name" 
          Width="Auto" 
          Binding="{Binding Name, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" /> 
     <DataGridTextColumn Header="State" 
          Width="Auto" 
          Binding="{Binding State, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" /> 
     <DataGridTextColumn Header="Folder" 
          Width="*" 
          Binding="{Binding ParentFolderPath, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" /> 
    </DataGrid.Columns> 
</DataGrid>