Подтвердить что ты не робот

Отключить выбор в WPF DataGrid

Как отключить выбор в WPFTooklit DataGrid? Я попытался изменить решение, которое работает для ListView (from 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>
4b9b3361

Ответ 1

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

dgGrid.UnselectAll();

Отменит выбор всех выбранных строк, и результат будет "Нет выбора строки".

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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

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

Если вам нужна дополнительная информация или углубленная прогулка для этого, см. мой пост в блоге:

Как отключить выбор строк в DataGrid WPF?

Ответ 6

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

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

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

Ответ 7

Еще один простой способ - изменить стиль выделения с помощью переключателя IsSelected Trigger to Transparent.

Ответ 8

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

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

Ответ 9

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

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

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

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

а затем привязывая его к вашему DataGrid

        <DataGrid
            RowStyle="{StaticResource DataGridUnselectableRowStyle}" >
            <!-- Contents -->
        </DataGrid>

Ответ 10

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

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

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

Ответ 11

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

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;