Элементы управления флажками в группе, которая является дочерней по отношению к родительской панели стека - PullRequest
0 голосов
/ 18 января 2012

У меня есть форма WPF со стековой панелью (имя MainStackPanel) в качестве родителя. У него есть различные групповые блоки как его дети. у каждой группы есть два флажка (флажок1 и флажок2).

Теперь я хочу добавить кнопку проверки всех на панель Mainstack, которая при нажатии автоматически проверяет все флажки1 в каждой группе.

Я новичок в 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 Ответ

1 голос
/ 18 января 2012

Что-то вроде этого должно работать:

Но, как предложил 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>

Класс помощника: (см. Как найти элементы управления WPF по имени или типу? )

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;
  }
}
...