2012-04-18 16 views
10

enter image description here我遇到的問題與DataGrid(WPF)中的複選框有關。爲了更好地理解問題,我附上了截圖。Datagrid列標題應根據是否選中某個DataGridView列的所有CheckBox來檢查/取消選中CheckBox的狀態

問題:即使其中一個子項未選中,也會檢查DataHeader列複選框。我期望解決方案能夠解決這個問題,以便當用戶明確地取消選中某個子項時,應該隱式地取消選中ALL(列標題)。

請幫助傢伙...謝謝 Plz檢查鏈接。我希望解決方案能夠像這樣工作。 http://www.codeproject.com/Articles/42437/Toggling-the-States-of-all-CheckBoxes-Inside-a-Dat#

<dg:DataGrid.Columns> 
    <dg:DataGridCheckBoxColumn Binding="{Binding Check}" IsThreeState="True" Width="50"> 
     <dg:DataGridCheckBoxColumn.HeaderTemplate> 
      <DataTemplate x:Name="dtAllChkBx"> 
       <CheckBox Name="cbxAll" Content="{x:Static properties:Resources.lblAll}" 
          Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" /> 
      </DataTemplate> 
     </dg:DataGridCheckBoxColumn.HeaderTemplate> 
    </dg:DataGridCheckBoxColumn> 

private void CheckBox_Unchecked(object sender, RoutedEventArgs e) 
{ 
    unchck_all_prd(); 
    dgEnggAcc.Items.Refresh(); 
} 

private void unchck_all_prd() 
{ 
    for (int i = 0; i < engg_list.Count; i++) 
    { 
     engg_list[i].Check = false; 
    } 
} 

private void chck_all_prd() 
{ 
    for (int i = 0; i < engg_list.Count; i++) 
    { 
     engg_list[i].Check = true; 
    } 
} 

public class EnggLst : ObservableCollection<EnggLst> 
{ 
    public bool Check { get; set; } 
} 
+0

請把你的XAML代碼 – ABH 2012-04-18 11:04:03

+0

在我看來,你不該」如果有一個未選中的行,則不要選中該標題。在我看來,如果所有的都沒有被選中,那就意味着所有的行都沒有被選中。你應該使用一個三態複選框,並使用第三個「我不知道」狀態來表示一個混合。 Windows以這種方式工作(可以考慮在資源管理器中選擇多個文件,其中一些文件是隻讀的,其中一些文件是不可讀的,如果您查看這些文件的屬性,只讀複選框將處於第三種狀態) – 2012-04-18 11:15:11

+0

<複選框名稱= 「cbxAll」 CONTENT = 「{x:靜態屬性:Resources.lblAll}」 選中= 「CheckBox_Checked」 未選中= 「CheckBox_Unchecked」> iYadav 2012-04-18 11:25:11

回答

4

使用此代碼爲我工作。

//this event is for **Checked and UnChecked** of up check box (cbxall) 
private void UpCheckbox_Checked(object sender, RoutedEventArgs e) 
{ 
    //checkBox1 = cbxall (your up checkbox) 
    if (checkBox1.IsChecked == true) 
    { 
     dataGrid1.Items.OfType<YourClass>().ToList().ForEach(x => x.IsChecked = true); 
    } 
    else 
    { 
     dataGrid1.Items.OfType<YourClass>().ToList().ForEach(x => x.IsChecked = false); 
    } 
} 

//this event is for all other check box 
//**Checked and UnChecked** of all other check box is this event 
private void OtherCheckbox_Checked(object sender, RoutedEventArgs e) 
{ 
    //checkBox1 = cbxall (your up checkbox) 
    if (dataGrid1.Items.OfType<YourClass>().All(x => x.IsChecked == true)) 
    { 
     checkBox1.IsChecked = true; 
    } 
    else if (dataGrid1.Items.OfType<YourClass>().All(x => x.IsChecked == false)) 
    { 
     checkBox1.IsChecked = false; 
    } 
    else 
    { 
     checkBox1.IsChecked = null; 
    } 
} 

希望這對你有好處。

+0

謝謝!它完美的作品:) – iYadav 2012-05-08 06:34:20

+0

嗨,我正在尋找相同的功能。在上述解決方案中,您直接調用checkBox1(cbxall),但我們沒有在代碼後面獲得checkbox id。我在最近四天卡住了這個解決方案 – Surya 2014-12-03 12:43:57

1

在您的XAML Datagrid中添加:

<DataGridTemplateColumn.Header> 
<CheckBox x:Name="ckbHeader" Click="ckbHeader_Click"></CheckBox> 
</DataGridTemplateColumn.Header> 

在你的代碼添加:

var ckbox = sender as CheckBox; 
var All = Collection.View.SourceCollection as List<ObjectX>; 

if (ckbox.IsChecked == true) 
{ 
    foreach (var item in All)  
     item.Marked = true;  
} 
else 
{ 
    foreach (var item in All)  
     item.Marked = false;   
} 
Collection.View.Refresh(); 

注:發件人是複選框

+0

用'true'檢查等同性是多餘的。只要說'if(ckbox.IsChecked)' – 2018-03-01 18:45:50

相關問題