c# - 您可以将 GroupBox 的可见性绑定(bind)到它的子项的可见性吗?

标签 c# wpf xaml data-binding

我在尝试让 GroupBox 折叠时遇到问题。我想要一个 GroupBox,如果它的所有子项都折叠了,它就会折叠。

我已经设法通过对属性进行多重绑定(bind)来实现这一点,如下所示。

<StackPanel>
    <GroupBox>
      <GroupBox.Visibility>
        <MultiBinding 
          Converter="{StaticResource multiBoolOrToVis}"
          ConverterParameter="{x:Static Visibility.Collapsed}"
        >
          <Binding Path="a_visible"/>
          <Binding Path="b_visible"/>
        </MultiBinding>
      </GroupBox.Visibility>
        <GroupBox.Header>
        <Label Content="GroupBox"/>
      </GroupBox.Header>
      <StackPanel>
        <Label 
          Content="A"
          Visibility="{Binding Path=a_visible, Converter={StaticResource boolToVis}}"
        />
        <Label 
          Content="B"
          Visibility="{Binding Path=b_visible, Converter={StaticResource boolToVis}}"
        />
      </StackPanel>
    </GroupBox>
    <Grid>
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
      </Grid.ColumnDefinitions>
      <CheckBox 
        Content="A Visible"
        Grid.Column="0"
        Grid.Row="1"
        IsChecked="{Binding Path=a_visible, Mode=TwoWay}"
      />
      <CheckBox 
        Content="B Visible"
        Grid.Column="1"
        Grid.Row="1"
        IsChecked="{Binding Path=b_visible, Mode=TwoWay}"
      />
    </Grid>
  </StackPanel>

这样做的问题是我们希望能够多次执行此操作而不用担心遗漏绑定(bind)。所以我的问题是有什么方法可以通用地执行此操作,最好是采用一种样式。另一个要求是它必须在 xaml 而不是代码隐藏中。

所以我理想的答案是一种样式,这样我就可以在我的 xaml 中执行以下操作。

<StackPanel>
    <GroupBox Style="ChildrenVisibilityStyle">
        <GroupBox.Header>
        <Label Content="GroupBox"/>
      </GroupBox.Header>
      <StackPanel>
        <Label 
          Content="A"
          Visibility="{Binding Path=a_visible, Converter={StaticResource boolToVis}}"
        />
        <Label 
          Content="B"
          Visibility="{Binding Path=b_visible, Converter={StaticResource boolToVis}}"
        />
      </StackPanel>
    </GroupBox>
    <Grid>
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
      </Grid.ColumnDefinitions>
      <CheckBox 
        Content="A Visible"
        Grid.Column="0"
        Grid.Row="1"
        IsChecked="{Binding Path=a_visible, Mode=TwoWay}"
      />
      <CheckBox 
        Content="B Visible"
        Grid.Column="1"
        Grid.Row="1"
        IsChecked="{Binding Path=b_visible, Mode=TwoWay}"
      />
    </Grid>
  </StackPanel>

我看过这些问题,它们让我认为这是不可能的; binding in controltemplate , stackpanel visibility , border visibility .

抱歉,如果之前已经回答过这个问题。预先感谢您的任何回答/评论。

最佳答案

您可以使用 MultiDataTrigger 在折叠子项时折叠 GroupBox

这是一个工作示例:

 <StackPanel>
    <GroupBox>
        <GroupBox.Header>
            <Label Content="GroupBox"/>
        </GroupBox.Header>
        <StackPanel>
            <Label x:Name="lbl_a" Content="A" Visibility="{Binding IsChecked, ElementName=chk_a, Converter={StaticResource boolToVis}}"  />
            <Label x:Name="lbl_b" Content="B" Visibility="{Binding IsChecked, ElementName=chk_b, Converter={StaticResource boolToVis}}"  />
        </StackPanel>
        <GroupBox.Style>
            <Style TargetType="GroupBox">
                <Style.Triggers>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding Visibility, ElementName=lbl_a}" Value="Collapsed" />
                            <Condition Binding="{Binding Visibility, ElementName=lbl_b}" Value="Collapsed" />
                        </MultiDataTrigger.Conditions>
                        <MultiDataTrigger.Setters>
                            <Setter Property="GroupBox.Visibility" Value="Collapsed" />
                        </MultiDataTrigger.Setters>
                    </MultiDataTrigger>
                </Style.Triggers>
            </Style>
        </GroupBox.Style>
    </GroupBox>

    <CheckBox x:Name="chk_a" Content="A Visible" Grid.Column="0" Grid.Row="1" />
    <CheckBox x:Name="chk_b" Content="B Visible" Grid.Column="1" Grid.Row="1"  />

</StackPanel>

关于c# - 您可以将 GroupBox 的可见性绑定(bind)到它的子项的可见性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15900255/

相关文章:

c# - 为什么 Blazor 不会路由到 Razor 库中的组件?

c# - 如何在 wpf 中使用 SbyteToBoolConverter 转换器,在 UI 中将 bool 属性转换为 sbyte

wpf - 如何在设计器中渲染更多/任何内容?

c# - 如何在选项卡 View 选择的 View (用户控件)中将焦点设置到文本框

c# - WPF Popup 有一个黑色边框而不是透明边框

c# - Nuget 组件缺失

c# - 命名空间隐含的上下文有多重要?

c# - 当从不同的窗口调用 repository.save 时,mvvm 更新 ListView

c# - PartialClassGenerationTask 和 MarkupCompilePass1 如何一起工作/属于

wpf - 使用 min(width, height)/2 作为半径在 WPF 中画一个圆