【问题标题】:Changing the background of a button in a DataGrid if the row is selected - WPF如果选择了行,则更改 DataGrid 中按钮的背景 - WPF
【发布时间】:2015-09-23 13:31:06
【问题描述】:

我有一个数据网格,其中包含一个包含几个按钮的模板列。 选择行时,我需要这些按钮的颜色从黑色变为白色。 虽然我不确定如何从按钮设置器中访问“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>

谢谢你, 尤塔姆

【问题讨论】:

    标签: c# wpf button datagrid styles


    【解决方案1】:

    最终我发现我需要将 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>
    

    【讨论】:

      【解决方案2】:

      尝试将此样式设置为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>
      

      【讨论】:

      • 嗨,不幸的是,这对我不起作用,但幸运的是,这产生了一个错误(无法在样式设置器上设置 targetname 属性),这导致我找到了一篇带有解决方案的文章:stackoverflow.com/questions/7965409/…跨度>
      猜你喜欢
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 2013-01-27
      • 2015-08-22
      • 1970-01-01
      • 2014-07-15
      相关资源
      最近更新 更多