如何在单击rowheader内的togglebutton时更改Datagrid行背景?

时间:2014-06-18 06:43:18

标签: c# wpf xaml

我正在重写DataGrid行标题样式,我遇到了以下两个问题:

1. DataGrid行标题包含Image和ToggleButton。当ToggleButton被'Checked'时,我想改变整行的背景颜色,但是我只是设法改变了行标题的背景,并且无法找到在行级别触发触发器的方法。

enter image description here

2.当选择行时,行和标题背景设置为不同的背景,反之则不起作用。我需要做的是在选择行标题时更改行的背景

enter image description here

这是DataGridRowHeader

的样式代码
<Style x:Key="{x:Type DataGridRowHeader}" TargetType="{x:Type DataGridRowHeader}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridRowHeader}">
                <Grid>
                    <Border Name="RowHeaderBorder"
                        BorderThickness="0,0,3,0"
                        Margin="0,0,0,0"
                        BorderBrush="{StaticResource DataGridRowBorder}">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="50"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>

                            <Image Grid.Column="0" Source="{Binding ImageSource}" RenderOptions.BitmapScalingMode="HighQuality" Stretch="None"  VerticalAlignment="Center" HorizontalAlignment="Center"/>
                            <ToggleButton x:Name="tglButton" Visibility="{Binding ActiveCall}"  Grid.Column="1"  Content="Button" Focusable="True" BorderThickness="1" Width="80" Height="33" VerticalAlignment="Top"  >
                            </ToggleButton>
                        </Grid>
                    </Border>
                </Grid>

                <ControlTemplate.Triggers>
                    <DataTrigger Binding="{Binding ElementName=tglButton, Path=IsChecked}" Value="true">
                        <Setter Property="Background"   TargetName="RowHeaderBorder" Value ="Green"/>
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

这是DataGridRow的样式:

<Style x:Key="DataGridRowStyle" TargetType="{x:Type DataGridRow}">

    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="BorderBrush" Value="{StaticResource DataGridRowBorder}"/>

    <Style.Triggers>
        <Trigger Property="IsMouseOver"   Value="true">
            <Setter Property="Background" Value="{StaticResource DataGridRowHoveredBackground}" />
            <Setter Property="FontWeight" Value="Bold"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="Effect">
                <Setter.Value>
                    <DropShadowEffect ShadowDepth="0"  BlurRadius="20"/>
                </Setter.Value>
            </Setter>
        </Trigger>

        <Trigger Property="IsSelected" Value="true">
            <Setter Property="Foreground" Value="Black"/>
            <Setter Property="Background" Value="{StaticResource RowBackgroundSelectedBrush2}" />
            <Setter Property="FontWeight" Value="Bold"/>
            <Setter Property="Effect">
                <Setter.Value>
                    <DropShadowEffect ShadowDepth="0"  BlurRadius="20"/>
                </Setter.Value>
            </Setter>

        </Trigger>
        <DataTrigger Binding="{Binding ElementName=DataGridRowHeader.tglButton, Path=IsChecked}" Value="true">
            <Setter Property="Background"   Value ="Green"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

1 个答案:

答案 0 :(得分:0)

这是因为tglButton出现在行标题中,它是DataGridRow的子标题。子行标题中定义的触发器正在尝试更新父项(DataGridRow)的属性,但无法找到它。

这方面的一个解决方案是为DataGridRowHeader模板中的DataGridRow定义模板,并为其提供名称,可以在触发器中使用。一个非常粗略的例子:

<Style
       TargetType="{x:Type DataGridRow}">

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridRow}">
                <Border x:Name="DGR_Border"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        Background="{TemplateBinding Background}"
                        SnapsToDevicePixels="True"
                        CornerRadius="8,8,8,8">
                    <SelectiveScrollingGrid>
                        <SelectiveScrollingGrid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="*" />
                        </SelectiveScrollingGrid.ColumnDefinitions>
                        <SelectiveScrollingGrid.RowDefinitions>
                            <RowDefinition Height="*" />
                            <RowDefinition Height="Auto" />
                        </SelectiveScrollingGrid.RowDefinitions>
                        <DataGridCellsPresenter Grid.Column="1"
                                                ItemsPanel="{TemplateBinding ItemsPanel}"
                                                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                        <DataGridDetailsPresenter Grid.Column="1"
                                                  Grid.Row="1"
                                                  SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, 
                                                    ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, 
                                                    Converter={x:Static DataGrid.RowDetailsScrollingConverter}, 
                                                    RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                                                  Visibility="{TemplateBinding DetailsVisibility}" />
                        <DataGridRowHeader Name="RHeader" Grid.RowSpan="2"
                                           SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical"
                                           Visibility="{Binding HeadersVisibility, 
                                            ConverterParameter={x:Static DataGridHeadersVisibility.Row}, 
                                            Converter={x:Static DataGrid.HeadersVisibilityConverter}, 
                                            RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}">

                                        <Grid>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="50" />
                                                <ColumnDefinition Width="*" />
                                            </Grid.ColumnDefinitions>

                                            <ToggleButton x:Name="tglButton"
                                                          Grid.Column="1"
                                                          Content="Button"
                                                          Focusable="True"
                                                          BorderThickness="1"
                                                          Width="80"
                                                          Height="33"
                                                          VerticalAlignment="Top">
                                            </ToggleButton>
                                        </Grid>
                        </DataGridRowHeader>

                    </SelectiveScrollingGrid>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsSelected"
                             Value="True">
                        <Setter TargetName="DGR_Border"
                                Property="Background"
                                Value="Gray" />
                    </Trigger>
                    <DataTrigger Binding="{Binding ElementName=tglButton, Path=IsChecked}"
                                 Value="true">
                        <Setter Property="Background"
                                TargetName="RHeader"
                                Value="Green" />
                        <Setter Property="Background"
                                Value="Green" />
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="DataContext"
            Value="{Binding RelativeSource={RelativeSource Self}}" />

    <Setter Property="BorderThickness"
            Value="1" />
    <Setter Property="BorderBrush"
            Value="Aqua" />

    <Style.Triggers>

        <Trigger Property="IsSelected"
                 Value="true">
            <Setter Property="Foreground"
                    Value="Black" />
            <Setter Property="Background"
                    Value="Pink" />
            <Setter Property="FontWeight"
                    Value="Bold" />
            <Setter Property="Effect">
                <Setter.Value>
                    <DropShadowEffect ShadowDepth="0"
                                      BlurRadius="20" />
                </Setter.Value>
            </Setter>

        </Trigger>

    </Style.Triggers>
</Style>