检查组合框中的复选框

时间:2014-10-21 02:20:25

标签: c# wpf checkbox combobox

我有一个组合框,其复选框为combobox.itemtemplate。

<ComboBox Name="comboBoxTest" 
                          SelectedValuePath="Test" 
                          SelectedItem="{Binding SelectedTest, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                          SelectedValue="{Binding SelectedTest, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                          ItemsSource="{Binding Test, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                          TextBoxBase.TextChanged ="comboBoxTest_TextChanged" Grid.ColumnSpan="2"
                          TextSearch.TextPath="Model" >
                    <ComboBox.ItemTemplate>
                        <DataTemplate>
                            <CheckBox Name="checkBoxTest"
                                      Content="{Binding Test}"
                                      Click="checkBoxTest_Click"/>
                        </DataTemplate>
                    </ComboBox.ItemTemplate>
                </ComboBox>

生成结果列表时,“ - 全选 - ”项已添加到结果列表中。 combobox with checkbox

当用户检查“全部”项目时,也应检查其他复选框。 我使用下面的代码,但它不起作用。

if (checkBoxTest.Content.ToString().Equals("--Select All--"))
{
     foreach (object item in comboBoxTest.Items)
     {
         ComboBoxItem comboBoxItem = comboBoxTest.ItemContainerGenerator.ContainerFromItem(item) as ComboBoxItem;
          FrameworkElement element = comboBoxItem.ContentTemplate.LoadContent() as FrameworkElement;
          CheckBox checkBox = element.FindName("checkBoxTest") as CheckBox;
          checkBox.IsChecked = true;
      }
 }

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

您的代码中几乎没有问题让我先告诉您这些问题。

  1. 你是否有条件识别&#34;全选&#34;复选框不正确。您需要使用Contains()而不是equals()
  2. 您提取的复选框在comboBox项目中不正确。如果您尝试查看checkBox.Content属性,则会看到null作为结果。
  3. 参见下面的代码,当&#34;选择全部&#34;时,选择组合框中的所有复选框。选中复选框。

    您的复选框点击事件应如下所示。

    private void checkBoxTest_Click(object sender, RoutedEventArgs e)
    {
                CheckBox checkBoxTest = e.Source as CheckBox;
                if (checkBoxTest == null)
                    return;
    
                if (checkBoxTest.Content.ToString().Contains("Select All") && checkBoxTest.IsChecked == true)
                {
                    foreach (object item in comboBoxTest.Items)
                    {
                        ComboBoxItem comboBoxItem = comboBoxTest.ItemContainerGenerator.ContainerFromItem(item) as ComboBoxItem;                   
                        if (comboBoxItem == null)
                        {
                            return;
                        }
                        CheckBox checkBox = FindVisualChildByName<CheckBox>(comboBoxItem, "checkBoxTest");
                        checkBox.IsChecked = true;
                    }
                }
    }
    

    我添加了一个新方法来从子名称及其类型中获取任何元素中的可视子对象。

    private static T FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject
            {
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
                {
                    var child = VisualTreeHelper.GetChild(parent, i);
                    string controlName = child.GetValue(NameProperty) as string;
                    if (controlName == name)
                    {
                        return child as T;
                    }
                    T result = FindVisualChildByName<T>(child, name);
                    if (result != null)
                        return result;
                }
                return null;
            }