Reputation: 1
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
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