在DataGrid中单击行不会选择它。

8

enter image description here

黑色背景 - 单元格。 灰色背景 - 行。 蓝色背景 - 选定的行。

如果我点击行,它不会被选中。但是,如果我点击单元格,行会被正确地选中。

<Window x:Class="Test021000.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:sys="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid Width="200" Height="200" ItemsSource="{Binding}" AutoGenerateColumns="False" SelectionUnit="FullRow">
            <DataGrid.DataContext>
                <x:Array Type="{x:Type sys:String}">
                    <sys:String>1</sys:String>
                    <sys:String>2</sys:String>
                    <sys:String>3</sys:String>
                    <sys:String>4</sys:String>
                    <sys:String>5</sys:String>
                </x:Array>
            </DataGrid.DataContext>
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding}" Width="100">
                    <DataGridTextColumn.CellStyle>
                        <Style TargetType="{x:Type DataGridCell}">
                            <Setter Property="Background" Value="Black" />
                            <Setter Property="Foreground" Value="White" />
                            <Setter Property="Margin" Value="15" />
                        </Style>
                    </DataGridTextColumn.CellStyle>
                </DataGridTextColumn>
            </DataGrid.Columns>
            <DataGrid.RowStyle>
                <Style TargetType="{x:Type DataGridRow}">
                    <Setter Property="Background" Value="LightGray" />
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Background" Value="Blue" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.RowStyle>
        </DataGrid>
    </Grid>
</Window>
2个回答

7
没有任何属性可以设置来改变这种行为。基本上,未单击单元格的情况下不应单击行。这就是控件的工作方式。
但是,您可以轻松地解决此问题。只需处理DataGridRowMouseLeftButtonDown事件并显式选择它即可:
<DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}">
        <EventSetter Event="MouseLeftButtonDown" Handler="DataGrid_MouseLeftButtonDown" />
        <Setter Property="Background" Value="LightGray" />
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Background" Value="Blue" />
            </Trigger>
        </Style.Triggers>
    </Style>
</DataGrid.RowStyle>

private void DataGrid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    DataGridRow dgr = sender as DataGridRow;
    dgr.IsSelected = true;
}

当控件不按照您的愿望或预期的方式运作时,您可以选择使用另一个控件、从头开始编写自己的控件,或者通过编写一些代码修改现有控件的行为 :)


2

我认为这与DataGridCell的模板有关。我建议使用DataGridTemplateColumn,其中单元格的Margin未设置:

<DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding}" Width="100">
                <DataGridTextColumn.CellStyle>
                    <Style TargetType="{x:Type DataGridCell}">
                        <Setter Property="Background" Value="Black" />
                        <Setter Property="Foreground" Value="White" />
                        <Setter Property="Margin" Value="15" />
                    </Style>
                </DataGridTextColumn.CellStyle> 
            </DataGridTextColumn>
            <DataGridTemplateColumn Width="100">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Margin="15" Text="{Binding}" Background="Black" Foreground="White" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>

是的,它能工作,但对我来说看起来像是一个权宜之计。行处理了鼠标点击事件,但IsSelected属性没有更新。我想也许有一个特殊的属性(比如SelectionUnit)可以修改这种行为。 - Der_Meister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接