Отключить выбор в WPF DataGrid - PullRequest
45 голосов
/ 23 марта 2010

Как я могу отключить выбор в WPFTooklit's DataGrid?Я попытался изменить решение, которое работает для ListView (из WPF ListView отключить выбор ), но это не работает:

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

Ответы [ 11 ]

32 голосов
/ 28 марта 2012

Чистым способом было бы просто переопределить стили строки и ячейки

<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>
18 голосов
/ 12 июня 2013

Просто добавьте IsHitTestVisible="False" к DataGrid определению.

13 голосов
/ 05 августа 2016

Чтобы полностью отключить выбор строк в 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 » в «Ложь» отключает все взаимодействие со строками, включая редактирование.

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

10 голосов
/ 24 мая 2011

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

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

Реальное решение - это, во-первых, предотвратить выбор, который не прост, но выполним с помощью нескольких простых шагов.

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

Если вам нужно больше подробностей или подробное описание, см. Мой пост в блоге:

Как отключить выбор строки в сетке данных WPF?

8 голосов
/ 16 июня 2010

Как указывает Sonic Soul здесь , решение Вики фактически не работает.

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

grid.SelectionChanged += (obj, e) => 
  Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => 
    grid.UnselectAll())); 
4 голосов
/ 10 мая 2012

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

<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>
4 голосов
/ 25 июля 2010

Другой простой способ - изменить стиль выделения с помощью триггера IsSelected на Transparent.

3 голосов
/ 15 июня 2017

Единственный правильный способ сделать это - отключить свойство 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>
0 голосов
/ 14 июня 2019

Мне нужен был код для решения. Это работает для меня:

controlGrid.SelectedCellsChanged += (sender, e) =>
    Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Render, new Action(() =>
        controlGrid.UnselectAll()));
controlGrid.Columns.Clear();

Поскольку он иногда мигает, BackgroundProperty также устанавливается прозрачным.

Style dataGridCellStyle = new Style(typeof(DataGridCell));
Setter newSetterCell = new Setter(DataGridCell.BackgroundProperty, Brushes.Transparent);
dataGridCellStyle.Setters.Add(newSetterCell);
controlGrid.CellStyle = dataGridCellStyle;
0 голосов
/ 17 мая 2015

Если кто-то еще сталкивается с той же проблемой, он может найти это полезным.

У нас было требование отключить несколько строк в сетке данных, но в то же время разрешить навигацию по клавишам со стрелками на них. Вот почему нам пришлось переключиться на IsHitTestVisible вместо того, чтобы управлять свойством IsEnabled. Поэтому мы не могли принять вышеприведенное решение о переключении на свойство IsEnable.

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

...