我有一个带有stackpanel(名称为MainStackPanel)的WPF表单作为父表单。它有各种各样的groupboxes作为它的孩子。每个groupbox都有两个复选框(checkbox1和checkbox2)。
现在我想在Mainstack面板中添加一个全部检查按钮,单击该按钮会自动检查每个组中的所有checkbox1。
我是WPF的新手,并试图找到如何实现这个
<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>
答案 0 :(得分:1)
这样的事情应该有效:
但正如jberger建议的那样:看看MVVM,它会让你的任务变得更加轻松......
<强> 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>
助手类: (见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);
}
}
}
}
<强>代码隐藏:强>
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;
}
}