如果选择了行,则更改 DataGrid 中按钮的背景 - WPF

Changing the background of a button in a DataGrid if the row is selected - WPF

我有一个数据网格,其中包含一个包含几个按钮的模板列。 选择行时,我需要这些按钮的颜色从黑色变为白色。 虽然我不确定如何从按钮设置器到达 "DataGridRow.IsSelected"。

这是我尝试过但没有奏效的方法:

        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Button CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=DataContext}"
                                Command="{Binding ViewModel.OnRemoveDirectoryClick, ElementName=Root}">
                            <Button.Style>
                                <Style>
                                    <Setter Property="Button.Background">
                                        <Setter.Value>
                                            <ImageBrush ImageSource="../../Images/menu_delete.png"/>
                                        </Setter.Value>
                                    </Setter>
                                    <Style.Triggers>
                                        <Trigger Property="DataGridRow.IsSelected" Value="True">
                                            <Setter Property="Button.Background">
                                                <Setter.Value>
                                                    <ImageBrush ImageSource="../../Images/menu_delete_white.png"/>
                                                </Setter.Value>
                                            </Setter>
                                        </Trigger>
                                    </Style.Triggers>
                                </Style>
                            </Button.Style>
                        </Button>
                    </StackPanel>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

谢谢, 约塔姆

尝试将此样式设置为 Resource

 <Style TargetType="{x:Type DataGridCell}">
    <Style.Triggers>
        <Trigger Property="DataGridCell.IsSelected"
                 Value="True">
            <Setter Property="Foreground" TargetName="YourButtonName"
                    Value="YourColor" />
        </Trigger>
    </Style.Triggers>
</Style>

最终我发现我需要将 DatatTrigger 与 DataGridRow 的相对来源一起使用

                                <Button.Style>
                                    <Style>
                                        <Setter Property="Button.Background">
                                            <Setter.Value>
                                                <ImageBrush ImageSource="../../Images/menu_delete.png"/>
                                            </Setter.Value>
                                        </Setter>
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" Value="True">
                                                <Setter Property="Button.Background">
                                                    <Setter.Value>
                                                        <ImageBrush ImageSource="../../Images/menu_delete_white.png"/>
                                                    </Setter.Value>
                                                </Setter>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </Button.Style>

我发现解决这个问题的另一种也许更优雅的方法是使用一个模板,该模板包含带有白色填充的矩形,它将按钮的背景作为不透明蒙版。

 <ControlTemplate x:Key="DataGridButtonTemplate" TargetType="{x:Type Button}">
    <Grid  Style="{x:Null}">
        <Rectangle x:Name="Mask" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" Opacity="{StaticResource NormalOpacity}" Style="{x:Null}"
                   OpacityMask="{TemplateBinding Background}" Fill="White" Visibility="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, Converter={StaticResource BoolToVisibilityConverter}}"/>
    </Grid>
</ControlTemplate>