c# - 单击行标题内的切换按钮时如何更改数据网格行背景?

标签 c# wpf xaml

我正在覆盖 DataGrid 行标题样式,但我遇到了以下两个问题:

1.DataGrid 行标题包含一个图像和一个切换按钮。当 ToggleButton 处于“选中”状态时,我想更改整行的背景颜色,但我只设法更改了行标题的背景,无法找到在行级别触发触发器的方法。

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>

最佳答案

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

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

<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>

关于c# - 单击行标题内的切换按钮时如何更改数据网格行背景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24278687/

相关文章:

c# - 为什么 =ViewData [""] 会显示一个字符串,但对同一字符串求值失败?

wpf - SoundPlayer 的替代品

.net - 如何将简单的 .net 属性绑定(bind)到标签并使其自动更新

c# - 在 XAML winrt 应用程序中,是否可以将深色主题仅应用于一个元素?

c# - .net 序列化 : How to use raw binary writer while maintaining which thing is which

c# - 单击一次不将 appsettings 安装到用户计算机

c# - 我可以在并行线程中更新一个实体吗?

wpf - 动态绑定(bind)到 Window 的 MenuItem 上的 ViewModel 命令

.net - 如何在自定义嵌套用户控件中引用另一个 XAML 元素?

c# - WPF 从 ViewModel 打开一个新 View