user1154892
user1154892

Reputation: 1

Checkbox controls in a groupbox which is a child of a parent stackpanel

I have a WPF form with the stackpanel(name is MainStackPanel) as the parent. It has various groupboxes as its children. each groupbox has two checkboxes(checkbox1 and checkbox2).

Now I want to add a check all button to the Mainstack Panel which when clicked will automatically check all the checkbox1 in each group.

I am new to WPF and trying to find out how to achieve this

<EDIT>

<StackPanel x:Name="MainStackPanel" Orientation="Vertical"> 

   <Grid DataContext="{Binding}"> 

      <Button Content="UnCheck All" Height="23" Name="uncheckall" 
              Width="75" Margin="434,0,492,0" /> 

      <Button Content="Check All" Height="23" Name="checkall" Width="75"
              Margin="175,0,751,0" Click="checkall_Click" />

   </Grid>

   <GroupBox>
      <Grid>
         <Grid.RowDefinitions>
           <RowDefinition Height="30"/>
           <RowDefinition/>
         </Grid.RowDefinitions>

         <CheckBox x:Name="checkbox1" 
                   Style="{StaticResource styleCheckBoxLeftSideText}" 
                   IsChecked="{Binding Path=Disabled, 
                               Converter={StaticResource BooleanConverter},
                               ConverterParameter='false,true'}"
                   VerticalAlignment="Center" 
                   HorizontalAlignment="Left" 
                   Content="Task Enabled:" 
                   Margin="9,0,0,0"/>
      </Grid>
   </GroupBox> 
</StackPanel>

</EDIT>

Upvotes: 0

Views: 5445

Answers (1)

SvenG
SvenG

Reputation: 5195

Something like this should work:

But as jberger suggested: Have a look at MVVM, it makes your task much more easier ...

XAML:

<GroupBox>
  <StackPanel>
    <CheckBox x:Name="checkbox1" Margin="5">CheckBox1</CheckBox>
    <CheckBox x:Name="checkbox2" Margin="5">CheckBox2</CheckBox>
  </StackPanel>
</GroupBox>

<GroupBox>
  <StackPanel>
    <CheckBox x:Name="checkbox3" Margin="5">CheckBox1</CheckBox>
    <CheckBox x:Name="checkbox4" Margin="5">CheckBox2</CheckBox>
  </StackPanel>
</GroupBox>

Helper Class: (see How can I find WPF controls by name or type?)

public static class VisualTreeExtensions
{
  public static IEnumerable<T> FindChildren<T>(this DependencyObject source)
    where T : DependencyObject
  {
    if (source != null)
    {
      IEnumerable<DependencyObject> childs = GetChildObjects(source);
      foreach (DependencyObject child in childs)
      {
        //analyze if children match the requested type
        if (child != null && child is T)
        {
          yield return (T)child;
        }

        //recurse tree
        foreach (T descendant in FindChildren<T>(child))
        {
          yield return descendant;
        }
      }
    }
  }

  public static IEnumerable<DependencyObject> GetChildObjects(
    this DependencyObject parent)
  {
    if (parent == null) yield break;

    if (parent is ContentElement || parent is FrameworkElement)
    {
      //use the logical tree for content / framework elements
      foreach (object obj in LogicalTreeHelper.GetChildren(parent))
      {
        var depObj = obj as DependencyObject;
        if (depObj != null) yield return (DependencyObject)obj;
      }
    }
    else
    {
      //use the visual tree per default
      int count = VisualTreeHelper.GetChildrenCount(parent);
      for (int i = 0; i < count; i++)
      {
        yield return VisualTreeHelper.GetChild(parent, i);
      }
    }
  }
}

Code-Behind:

private void checkall_Click(object sender, RoutedEventArgs e)
{
  SetCheckBoxCheckedStatus(true);
}

private void uncheckall_Click(object sender, RoutedEventArgs e)
{
  SetCheckBoxCheckedStatus(false);
}

private void SetCheckBoxCheckedStatus(bool isChecked)
{
  foreach (CheckBox check in MainStackPanel.FindChildren<CheckBox>())
  {
    check.IsChecked = isChecked;
  }
}

Upvotes: 4

Related Questions