2017-02-10 6 views
2

enter image description hereНажмите на строку в DataGrid не выбирает

Черный фон - ячейка. Серый фон - ряд. Синий фон - выбранный ряд.

Если я нажму на строку, она не станет выбрана. Однако, если я нажимаю на ячейку, строка выбирается правильно.

<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> 

ответ

1

Я думаю, что это связано с шаблоном DataGridCell. Я предложил бы использовать DataGridTemplateColumn, в котором маржа не установлена ​​в Cell:

<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> 
+0

Да, это работает, но для меня это похоже на работу. Строка обрабатывает щелчок мышью, но IsSelected не обновляется. Я думал, что существует специальное свойство (например, SelectionUnit), которое изменяет поведение. –

1

Там не свойство, которое вы можете установить, чтобы изменить это поведение. Строка не должна быть нажата без щелчка камеры. Вот как работают элементы управления.

Но вы можете легко обойти это, хотя. Просто обрабатывать MouseLeftButtonDown событие DataGridRow и выберите его в явном виде:

<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; 
} 

Когда элемент управления не ведет себя так, как вам нравится, или, как вы ожидаете, вы либо использовать другой элемент управления, написать ваш собственный с нуля или изменить поведение существующего, написав код :)