2010-03-23 4 views
38

Как отключить выбор в файле WPFTookl's DataGrid? Я попытался модифицировать решение, которое работает для ListView (от WPF ListView turn off selection), но это не работает:Отключить выбор в WPF DataGrid

<tk:DataGrid> 
    <tk:DataGrid.ItemContainerStyle> 
     <Style TargetType="{x:Type tk:DataGridRow}"> 
      <Setter Property="Focusable" Value="false"/> 
     </Style> 
    </tk:DataGrid.ItemContainerStyle> 
    <tk:DataGrid.CellStyle> 
     <Style TargetType="{x:Type tk:DataGridCell}"> 
      <Setter Property="Focusable" Value="false"/> 
     </Style> 
    </tk:DataGrid.CellStyle> 
</tk:DataGrid> 

ответ

-2

Существует трюк для этого. Вы можете обрабатывать SelectionChanged событие DataGrid (скажем dgGrid) и в обработчик записи:

dgGrid.UnselectAll(); 

Это отмените все выбранные строки и результат будет «строка не выбрана».

+12

не работает: это работает: http://stackoverflow.com/questions/3046988/wpf-datagrid-disable-selected-row-styles-or-row-selecting – Mikhail

+0

+1 Это правильный ответ:) ... в любом случае моя работа отлично работает мой случай :) – viky

+0

спасибо. это помогло мне .. –

4

Как указано Sonic Soul here, решение viky на самом деле не работает.

Вот фактический рабочий код, чтобы отключить выделение в DataGrid:

grid.SelectionChanged += (obj, e) => 
    Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => 
    grid.UnselectAll())); 
+1

Этот метод следует сочетать с установкой свойства DataGrid SelectionMode на «Single» ... в противном случае вы можете выбрать несколько ячеек до того, как событие будет запущено. – Sherlock

4

Другой простой способ изменить стиль выбора с IsSelected Trigger к прозрачному.

+1

у вас есть пример кода? –

11

Все это - хорошие идеи для простых хаков. Однако они не выполняют именно то, что задают. Другие ответы говорят нам о том, как отменить выбор, выбранный пользователем, или скрыть тот факт, что пользователь выбрал что-то.

Однако я понимаю, почему эти ответы даны. Нелегко обеспечить реальное решение.

Настоящим решением является предотвращение выбора в первую очередь, что не просто, но это выполнимо с помощью нескольких простых шагов.

Ответа на этот вопрос 1. Вам нужно скопировать стиль в Expression Blend (или найти где-то копию стиля). 2. Измените один параметр ItemPresenter. Мне было достаточно установить IsHitTestVisible = «False» на ItemPresenter.

Если вам нужно больше информации, или углубленные ходить через для этого, см мой пост в блоге:

How to disable row selection in a WPF DataGrid?

+1

это «правильный» способ –

+8

Это тоже не совсем правильно: он останавливает клики, происходящие на 'DataGridCell', что часто нежелательно. – Zero

+0

Согласовано. На днях мне нужно будет найти решение, которое отключает выбор, но позволяет кликать. – Rhyous

26

Чистый путь будет, просто переопределить стили строки и клетка

<DataGrid.Resources> 
    <ResourceDictionary> 
     <Style x:Key="{x:Type DataGridCell}" TargetType="{x:Type DataGridCell}"> 
      <Setter Property="Background" Value="{x:Null}" /> 
      <Setter Property="BorderBrush" Value="{x:Null}" /> 
      <Style.Triggers> 
       <Trigger Property="IsSelected" Value="True"> 
        <Setter Property="Background" Value="{x:Null}" /> 
        <Setter Property="BorderBrush" Value="{x:Null}" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
     <Style TargetType="{x:Type DataGridRow}"> 
      <Setter Property="Background" Value="{x:Null}" /> 
      <Setter Property="BorderBrush" Value="{x:Null}" /> 
      <Style.Triggers> 
       <Trigger Property="IsSelected" Value="True"> 
        <Setter Property="Background" Value="{x:Null}" /> 
        <Setter Property="BorderBrush" Value="{x:Null}" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ResourceDictionary> 
</DataGrid.Resources> 
+2

Этот отключенный выбор вообще. Я должен был заменить «{x: Null}» на «Прозрачный», чтобы сохранить работу выбора. Так рекомендовал г-н Снагглс. – OneWorld

+3

FYI, не забудьте установить '' в триггере, иначе текст выделения будет по умолчанию белым. –

+2

@ JiBéDoublevé Мне просто нужно было это сделать, но вместо того, чтобы использовать твердое значение, я помещал это в триггеры DataGridCell: '', который устанавливает его в то, что он уже есть.Как ни странно, кажется, что _explicitly_ устанавливает цвет в определении столбца, также удаляет изменение цвета, без необходимости установки. – Xcelled194

4

В случае, если вы используете альтернативные цвета:

<Style TargetType="{x:Type DataGrid}"> 
    <Setter Property="RowBackground" Value="#badeee"/> 
    <Setter Property="AlternationCount" Value="2" /> 
    <Setter Property="AlternatingRowBackground" Value="#92cce5"/> 
</Style> 

<Style TargetType="{x:Type DataGridCell}"> 
    <Style.Triggers>   
     <Trigger Property="IsSelected" Value="True"> 
      <Setter Property="Background" Value="Transparent"/> 
      <Setter Property="BorderBrush" Value="Transparent"/> 
      <Setter Property="Foreground" Value="Black"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

<Style TargetType="{x:Type DataGridRow}"> 
    <Style.Triggers> 
     <Trigger Property="ItemsControl.AlternationIndex" Value="0"> 
      <Setter Property="Background" Value="#badeee"></Setter> 
      <Setter Property="BorderBrush" Value="#badeee"></Setter> 
     </Trigger> 
     <Trigger Property="ItemsControl.AlternationIndex" Value="1"> 
      <Setter Property="Background" Value="#92cce5"></Setter> 
      <Setter Property="BorderBrush" Value="#92cce5"></Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style> 
16

Просто введите IsHitTestVisible="False" в определение DataGrid.

+19

Это препятствует тому, чтобы вертикальная полоса прокрутки реагировала на мышь. – edtheprogrammerguy

+4

Идеальное решение для моих нужд, спасибо! – TrueEddie

+3

Работает как шарм ... и если вы привязываете значение к свойству INPC, тогда вы можете выбирать, какие строки можно выбрать :-) – Heliac

0

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

У нас было требование отключить несколько строк на datagrid, но в то же время разрешить навигацию по ним на СТРЕЛКЕ. Вот почему нам пришлось переключиться на «IsHitTestVisible» вместо управления свойством IsEnabled. Таким образом, мы не смогли принять решение выше о переключении на свойство IsEnable.

Вот как я решил решить эту проблему. Я создал новое прикрепленное свойство (RowEnable) для DataGridRow. Это прикрепленное свойство может быть привязано к свойству viewmodel для управления «виртуальным» включением и отключением.Я также создал новый стиль для DataGridCell, где я устанавливаю 'IsHitTestVisible' в false, основываясь на том же свойстве viewmodel. Итак, рассмотрите его как строку, которую может видеть мышь/клавиатура, но не можем видеть ее ячейки/столбцы. Это означает, что теперь я могу создать строку на основе нового прикрепленного свойства (RowEnabled), чтобы выглядеть отключенным/включенным. В то же время я могу просматривать подсказки для этих строк, которые практически отключены.

9

Чтобы полностью отключить выбор строк в DataGrid, вы можете сделать следующее:

<DataGrid> 
    <DataGrid.RowStyle> 
     <Style TargetType="DataGridRow"> 
      <Setter Property="IsHitTestVisible" Value="False"/> 
     </Style> 
    </DataGrid.RowStyle> 
    <!--Other DataGrid items--> 
</DataGrid> 

Это можно считать более благоприятным, чем установка <Setter Property="IsEnabled" Value="False"/> из-за того, что делает вышеупомянутый метод вызывает стиль строка для изменения. Он также не отключает контекстные меню при щелчке правой кнопкой мыши.

И последнее: важно отметить, что настройка «IsHitTestVisible» на «False» отключает все взаимодействие со строками, включая редактирование.

Однако, если все, что вы хотите сделать, это изменить стиль строки при выборе, просмотрите ответы here.

+1

Этот ответ вроде спас мою жизнь! –

1

Единственный правильный способ я нашел, чтобы сделать это, чтобы отключить IsHitTestVisible свойства на DataGrid Row Style.

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

Чистый способ сделать это через новый стиль в ваших статических ресурсов (копирование других сеттеров, в соответствующих случаях)

 <Style x:Key="DataGridUnselectableRowStyle" TargetType="{x:Type DataGridRow}"> 
      <Setter Property="IsHitTestVisible" Value="False"/> 
     </Style> 

, а затем связывания его на DataGrid

 <DataGrid 
      RowStyle="{StaticResource DataGridUnselectableRowStyle}" > 
      <!-- Contents --> 
     </DataGrid> 
Смежные вопросы