需要帮助来管理wpf DataGrid中的选定行样式,具体取决于绑定属性

时间:2017-03-24 13:22:30

标签: wpf datagridview wpfdatagrid

我需要转移到Windows窗体应用程序的wpf。我在为Wpf DataGrid制作相同风格的DataGridView时遇到了一些问题。

DataGridView通过DataSource属性填充List。

public class GameItem
{
    public string Name { get; set; }
    public bool Selected { get; set; }
}

当选择= True时,DGV上的整行为红色,否则为GreenYellow。 SelectionColor始终与标准颜色相同,因此在行之间移动不会改变任何颜色。

这是DefaultCellStyle:

dataGridViewCellStyle4.BackColor = System.Drawing.Color.GreenYellow;
dataGridViewCellStyle4.ForeColor = System.Drawing.SystemColors.ControlText;
dataGridViewCellStyle4.SelectionBackColor = System.Drawing.Color.GreenYellow;
dataGridViewCellStyle4.SelectionForeColor = System.Drawing.SystemColors.ControlText;


void dgvDetail_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.RowIndex >= 0)
    {
        var gameItem = (sender as DataGridView).Rows[e.RowIndex].DataBoundItem as GameItem;
        if (gameItem != null && gameItem.Selected)
        {
          e.CellStyle.SelectionForeColor = Color.White;
          e.CellStyle.SelectionBackColor = Color.Red;
          e.CellStyle.ForeColor = Color.White;
          e.CellStyle.BackColor = Color.Red;
        }
    }
}

这是wpf应用程序中Grid的定义:

<Window x:Class="TestGrid.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TestGrid"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"  Color="Red"/>

        <Style TargetType="DataGrid">
            <Style.Resources>
                <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Red"/>
            </Style.Resources>
            <Setter Property="FontSize" Value="10pt" ></Setter>
            <Setter Property="FontFamily" Value="Microsoft Sans Serif" ></Setter>
            <Setter Property="FontWeight" Value="Bold" ></Setter>
            <Setter Property="SelectionUnit" Value="FullRow" ></Setter>
            <Setter Property="HeadersVisibility" Value="Row" ></Setter>
            <Setter Property="AutoGenerateColumns" Value="False" ></Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <DataGrid Name="dg1">
            <DataGrid.RowStyle>
                <Style TargetType="{x:Type DataGridRow}">
                    <Setter Property="Background" Value="GreenYellow"></Setter>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Selected}" Value="True">
                            <Setter Property="Background" Value="Red"/>
                            <Setter Property="Foreground" Value="White"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.RowStyle>
            <DataGrid.Columns>
                <DataGridTextColumn Header="Description" Binding="{Binding Description}" Width="Auto" />
                <DataGridTextColumn Header="Manufacturer" Binding="{Binding Manufacturer}" Width="*" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

我有这个问题:

在wpf我不明白如何将行指示箭头显示在行标题中。

在wpf中当用户点击一个被选中并改变颜色的行时,我不想要这个行为。我想只有当有界的Selected item属性为true时,一行才是红色的。因此,单击一行不能改变颜色,背景颜色必须保持绿色,前景白色在数据源中为Selected = false。

这是Windows窗体版本:

DataGridView

这是wpf,第1行和第3行被正确绘制,因为绑定项目具有Selected = True。问题是当单击一行时(图中的1943),即使Selected为false,它也会突出显示,我想避免活动行突出显示为窗体版本。

wpf DataGrid

1 个答案:

答案 0 :(得分:0)

禁用鼠标选择上的红色高亮显示删除HighlightBrushKey资源(或至少更改颜色以查看差异)

更改行标题为DataGridRowHeader类型创建样式:

<Style TargetType="{x:Type DataGridRowHeader}" BasedOn="{StaticResource {x:Type DataGridRowHeader}}">            
    <Setter Property="BorderBrush" Value="Black"/>
    <Setter Property="BorderThickness" Value="0,0,1,1"/>
    <Setter Property="Background" Value="GreenYellow"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding Selected}" Value="True">
            <Setter Property="Background" Value="Red"/>                    
        </DataTrigger>
        <Trigger Property="IsRowSelected" Value="True">
            <Setter Property="Content" Value="&#9656;"/>                
            <Setter Property="Background" Value="{StaticResource {x:Static SystemColors.HighlightBrushKey}}"/>
        </Trigger>
    </Style.Triggers>
</Style>

当Selected属性为true时,行标题为红色,否则为GreenYellow。当使用输入选择行时,它会显示黑色右指向小三角形字符。

或者甚至隐藏行标题并使用DataGridTemplateColumn而不是选定的单元格将显示>

修改了行和单元格样式以更改选择前景

<DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}">
        <Setter Property="Background" Value="GreenYellow"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding Selected}" Value="True">
                <Setter Property="Background" Value="Red"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</DataGrid.RowStyle>
<DataGrid.CellStyle>
    <Style TargetType="DataGridCell">
        <Setter Property="Foreground" Value="Black"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding Selected}" Value="True">
                <Setter Property="Foreground" Value="White"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</DataGrid.CellStyle>