2012-05-16 55 views
0

我想找到多少複選框是由代碼進行覈對:我有一個列表框和複選框,我怎麼能找到多少複選框WPF檢查

<Grid Width="440" > 

<ListBox Name="listBoxZone" ItemsSource="{Binding TheList}" Background="White" Margin="0,120,2,131"> 
     <ListBox.ItemTemplate> 
      <HierarchicalDataTemplate> 
    <CheckBox Name="CheckBoxZone" Content="{Binding StatusName}" Tag="{Binding StatusId}" Margin="0,5,0,0" VerticalAlignment ="Top" /> 
      </HierarchicalDataTemplate> 
     </ListBox.ItemTemplate> 
</ListBox> 

     </Grid> 

這裏是我的代碼在哪裏我想找到多少複選框被選中?

for (int i = 0; i < listBoxZone.Items.Count; i++) 
        { 
         if (CheckBoxZone.IsChecked == true) 
         { 


         } 

        } 
+0

你的方法有什麼問題? – Reniuz

回答

3

你可以Nullable<bool>類型的IsChecked屬性(可以寫成bool?)添加到您的數據項類和雙向綁定CheckBox.IsChecked屬性:

<CheckBox Name="CheckBoxZone" IsChecked={Binding IsChecked, Mode=TwoWay} ... /> 

現在,你可以簡單的疊代所有項目,並檢查他們的IsChecked狀態:

int numChecked = 0; 
foreach (MyItem item in listBoxZone.Items) 
{ 
    if ((bool)item.IsChecked) // cast Nullable<bool> to bool 
    { 
     numChecked++; 
    } 
} 

或使用LINQ:

int numChecked = 
    itemsControl.Items.Cast<MyItem>().Count(i => (bool)i.IsChecked); 

而只是記:爲什麼你在ListBox使用HierarchicalDataTemplate,其中DataTemplate就足夠了? LINQ

int result = 
      listBoxZone.Items.OfType<CheckBox>().Count(i => i.IsChecked == true); 

+0

@Abhishek如果這個答案解決了你的問題,你應該考慮接受它。只需檢查左側的接受標記即可。 – Clemens

0

使用OfType方法我用OfType,而不是Cast因爲OfType會工作,即使有一個複選框項目或所有項目的複選框。

如果是Cast,即使單個項目不是複選框,也會出錯。

+0

在我的回答中,我假設所有項目都是(相同)類型'MyItem',因此'Cast <>'完全可以。我沒有迭代CheckBoxes,因爲它們既不是項目類型,也不是項目容器類型。這裏CheckBox在DataTemplate中是「隱藏的」,並且不容易被應用程序代碼訪問。你的'結果'將始終爲零。 – Clemens

+0

'Cast <>'甚至比'OfType <>'更好,因爲如果添加了錯誤地不是'MyItem'的項目,它提供了一個快速錯誤檢測功能。 – Clemens

相關問題