2014-07-23 50 views
1

我有一個複選框列的數據網格。如果有人點擊列標題中的複選框,則應檢查該特定列中存在的所有複選框。如何使用XAML來實現?如何通過單擊DatagridCheckBox列的CheckBox列標題來選擇所有複選框?

的XAML:

<DataGrid AlternationCount="2" AutoGenerateColumns="False" ItemsSource="{Binding}" Height="325" HorizontalAlignment="Left" Margin="0,178,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="733" > 
      <DataGrid.Columns>     
       <DataGridTemplateColumn> 
        <DataGridTemplateColumn.Header> 
         <CheckBox Name="colCheckBox" Content="Select All" Width="70" Checked="colCheck_Checked" /> 
        </DataGridTemplateColumn.Header> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate>        
           <CheckBox Name="rowCheckBox" HorizontalAlignment="Center"/>       
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
       <DataGridTextColumn Header="ProjectId" Binding="{Binding ProjectId}" Width="200"/> 
       <DataGridTextColumn Header="BaselineStartDate" Binding="{Binding BaselineStartDate}" Width="200"/> 
       <DataGridTextColumn Header="BaselineEndDate" Binding="{Binding BaselineEndDate}" Width="200"/> 
      </DataGrid.Columns> 
     </DataGrid> 
+1

其實你不需要在xaml中完成,只需將屬性布爾值設置爲true – Sajeetharan

+0

您應該將列標題中複選框的屬性IsChecked綁定到所有複選框的屬性IsChecked。這可以在代碼隱藏中完成,無需像在@Sajeetharan中指出的那樣在XAML代碼中完成。 –

回答

1

你能不只是數據的CheckBoxHeaderIsChecked屬性綁定直接到行中的CheckBox ES的IsChecked財產?這應該做的伎倆:

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.Header> 
     <CheckBox Name="colCheckBox" Content="Select All" Width="70" /> 
    </DataGridTemplateColumn.Header> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <CheckBox Name="rowCheckBox" IsChecked="{Binding IsChecked, 
       ElementName=colCheckBox}" HorizontalAlignment="Center"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

當然,這也將允許用戶取消所有從任何行Checkbox ES的,你可能不希望出現這種情況。或者,您可以使用數據綁定,如果你在你的項目類有bool屬性:

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.Header> 
     <CheckBox IsChecked="{Binding MasterIsChecked}" Content="Select All" /> 
    </DataGridTemplateColumn.Header> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <CheckBox IsChecked="{Binding IsChecked}" HorizontalAlignment="Center"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

,然後更新從MasterIsChecked財產視圖模型的項目(或代碼後面):

public bool MasterIsChecked 
{ 
    get { return masterIsChecked; } 
    set 
    { 
     masterIsChecked = value; 
     NotifyPropertyChanged("MasterIsChecked"); 
     foreach (YourClass item in YourItems) item.IsChecked = masterIsChecked; 
    } 
} 
+2

這是什麼意思***這也將允許用戶取消選中任何行中的所有複選框***?我不確定這裏綁定的默認'Mode',但是明確地將它設置爲'OneWay'可以防止這種情況發生(如果我明白你的意思是正確的)。但即使增加了,行爲仍然不好。例如,當用戶取消選中一行時,CheckBox標題也應該被取消選中(因爲不是所有的行都被檢查了)。如果用戶手動檢查所有行,還應該檢查標題CheckBox(因爲現在檢查所有行)。 –

相關問題