在DataGrid中突出显示SelectedItem的行

时间:2011-09-08 21:15:05

标签: c# wpf xaml datagrid

我正在尝试使用DataGrid的ScrollIntoView,并以另一种颜色突出显示特定的行和列。 ScrollIntoView可以跳到正确的位置。重点不是。以下是我用来跳到这个位置的信息:

    public void ShowSelection(int row, int column)
    {
        dtGridReads.SelectedItem = dtGridReads.Items[row];
        dtGridReads.SelectedItem = dtGridReads.Columns[column];
        dtGridReads.UpdateLayout();
        dtGridReads.ScrollIntoView(dtGridReads.Items[row], dtGridReads.Columns[column]);
    }

这是我的WPF数据网格:

<DataGrid x:Name="dtGridReads"  AutoGenerateColumns="False" 
            VirtualizingStackPanel.IsVirtualizing="True"                                       
            VirtualizingStackPanel.VirtualizationMode ="Standard" 
              EnableColumnVirtualization="True"
              EnableRowVirtualization="True"
            ScrollViewer.IsDeferredScrollingEnabled="True"
            CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="True"
             ItemsSource ="{Binding}" Block.TextAlignment="Center"
             CanUserAddRows="False" CanUserDeleteRows="False" FrozenColumnCount="1"
               GridLinesVisibility="None" Style="{StaticResource DataGridStyle_Blue}"     ScrollViewer.ScrollChanged="dtGridReads_ScrollChanged">
        <DataGrid.RowStyle>
            <Style TargetType="{x:Type DataGridRow}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=IsSelected}" Value="True">
                        <Setter Property="Background" Value="Red" />
                    </DataTrigger >
                </Style.Triggers>
            </Style>
        </DataGrid.RowStyle>
    </DataGrid>

感谢。

2 个答案:

答案 0 :(得分:2)

您的ItemsSource对此有何看法?

您的触发器正在尝试绑定到每个DataGridRow的基础对象的IsSelected属性,因此如果该对象没有该属性,那么您将不会获得任何结果。在DataGrid上设置SelectedItem不会影响您的触发器,如上所述。

编辑: 我把一个快速的样本放在一起进行测试。正如预期的那样,你试图绑定到错误的东西(如果目标是突出显示红色的特定单元格,那么看起来你也有错误的目标。)

如果用这个替换整个DataGrid.RowStyle块,它将按预期工作:

        <DataGrid.CellStyle>
            <Style TargetType="{x:Type DataGridCell}">
                <Style.Triggers>
                    <Trigger Property="DataGridCell.IsSelected" Value="True">
                        <Setter Property="Background" Value="Red" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DataGrid.CellStyle>

答案 1 :(得分:0)

这也可以使用DataGrid拥有的属性,例如DataGridRow.IsSelectedDataGridCell.IsSelected

来完成。

<Style TargetType="{x:Type DataGridRow}" x:Key="RowCustomStyle">
                <Style.Triggers>
                    <Trigger Property="DataGridRow.IsSelected" Value="True">
                <Setter Property="Background" Value="Red" />
            </Trigger>
                </Style.Triggers>
            </Style>

<Style TargetType="{x:Type DataGridRow}" x:Key="RowCustomStyle">
                <Style.Triggers>
                    <Trigger Property="DataGridCell.IsSelected" Value="True">
                <Setter Property="Background" Value="Red" />
            </Trigger>
                </Style.Triggers>
            </Style>

现在,您必须告诉数据网格有关样式和所选项目的信息

<DataGrid  ItemsSource="{Binding Path=ItemsSource, Mode=TwoWay, NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True}" SelectionMode="Single" 
                         RowStyle="{StaticResource RowCustomStyle}"  SelectedItem="{Binding Path=SelectedItem}">

现在,您应该在ModelView中具有一个名为SelectedItem的属性,其中包含要选择的数据网格中的对象。