it-swarm.com.ru

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

Как я могу отключить выбор в DataGrid? .__ в WPFTooklit. Я попытался изменить решение, которое работает для 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>
42
svick

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

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

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

17
Yuri

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

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

11
Joshua

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

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

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

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

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

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

10
Rhyous

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

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

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

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

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

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

4
Mr. Snuggles

Единственный правильный способ сделать это - отключить свойство 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>
3
Mindaugas-kun

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

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

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

0
Vipin Gupta