2012-01-17 42 views
0

我有一个带有作为父组件的StackPanel(名称为MainStackPanel)的WPF窗体。它有各种各样的groupboxes作为它的孩子。每个组框有两个复选框(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

到目前为止你做了什么/试过了吗?向我们展示一些代码可以帮助很多。 – 2012-01-17 21:32:31

+0

这里是堆栈面板代码和组框代码。 (组框有一个网格,复选框在网格内) – user1154892 2012-01-17 21:36:54

+0

你有模型支持你的用户界面吗? – 2012-01-17 21:48:22

回答

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; 
    } 
} 
+0

谢谢大家的帮助。让我在我的代码中尝试 – user1154892 2012-01-18 13:49:38