复选框控件在组框中,该组框是父堆栈面板的子级

时间:2012-01-17 21:21:01

标签: wpf children

我有一个带有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>

1 个答案:

答案 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;
  }
}