使用BasedOn和Trigger来操作父样式中的嵌套属性

时间:2014-01-17 22:07:00

标签: c# wpf

我们有一个标准样式的文件。我们在所有GroupBox元素上使用了一种样式SectionGroup。它有一个自定义模板,使用边框在标题下面添加下划线等。

在一个页面上,我们在GroupBox标题旁边有一个复选框;当用户取消选中该复选框时,GroupBox的内容将隐藏(可见性已折叠)并且标题仍保留。不幸的是,标题下面的下划线看起来很难看;我们也想隐藏这个。

我已经给了我最好的尝试,所以父SectionGroup样式现在看起来像这样:

<Style x:Key="SectionGroup" TargetType="GroupBox">
  <Style.Resources>
    <Thickness x:Key="HeaderBorderThickness">0,0,0,1</Thickness>
  </Style.Resources>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="GroupBox">
        <Grid Margin="0">
          ...
          <Border Grid.Row="0" BorderThickness="{DynamicResource HeaderBorderThickness}" >
            <TextBlock Text="{Binding Header, RelativeSource={RelativeSource AncestorType=GroupBox}}"/>
          </Border>
          ...
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

通过定义HeaderBorderThickness资源并将其用作DynamicResource,我可以在我的页面中覆盖它(as explained in this answer):

<GroupBox>
  <GroupBox.Style>
    <Style TargetType="GroupBox" BasedOn="{StaticResource SectionGroup}">
      <Style.Resources>
        <Thickness x:Key="HeaderBorderThickness">0,0,0,0</Thickness>
      </Style.Resources>
      <!-- TODO triggers here.. -->
    </Style>
  </GroupBox.Style>
  <GroupBox.Header>Section One</GroupBox.Header>
  ...contents...
</GroupBox>

的确,通过重新定义相同键的厚度,DynamicResource按预期工作,并且标题上没有下划线。

现在我需要根据触发器/绑定来切换它。我对此很陌生,但在本页的其他地方我已经想出了这样的事情:

<Grid Visibility="{Binding Path=FooBoolean, Converter={StaticResource BooleanToVisibility}}">

我认为我们的viewmodel类中有更多魔法(遵循现有绑定和属性的示例),但它可以工作。

现在问题是 - 如何将FooBoolean中的布尔值绑定到HeaderBorderThickness资源值?或者我可以使用其他方法来实现我的目标?

1 个答案:

答案 0 :(得分:0)

在我看来,您可以使用DataTrigger以更多WPF方式执行此操作,可能是这样的:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <TextBlock Text="{Binding Header, RelativeSource={RelativeSource AncestorType=
        GroupBox}}"/>
    <Rectangle Grid.Row="1" Height="1" Margin="0,2,0,0" Fill="Black">
        <Rectangle.Style>
            <Style>
                <Setter Property="Rectangle.Visibility" Value="Visible" />
                <Style.Triggers>
                    <DataTrigger Binding="{IsChecked, ElementName=YourCheckBox}" 
                        Value="False">
                        <Setter Property="Rectangle.Visibility" Value="Collapsed" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Rectangle.Style>
    </Rectangle>
</Grid>

此方法可让您设置WidthHeightPadding以及该行的其他任何属性。如果您无法直接从CheckBox访问Style,那么您可以尝试添加bool属性以绑定Checkbox.IsChecked属性 DataTrigger.Binding属性。或者只是用自己的方法管理Rectangle.Visibility