Ответ 1
Есть трюк для этого. Вы можете обработать событие SelectionChanged для DataGrid (скажем, dgGrid) и в записи обработчика:
dgGrid.UnselectAll();
Отменит выбор всех выбранных строк, и результат будет "Нет выбора строки".
Как отключить выбор в 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>
Есть трюк для этого. Вы можете обработать событие SelectionChanged для DataGrid (скажем, dgGrid) и в записи обработчика:
dgGrid.UnselectAll();
Отменит выбор всех выбранных строк, и результат будет "Нет выбора строки".
Чистым способом было бы просто переопределить стили строки и ячейки
<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>
Просто добавьте определение IsHitTestVisible="False"
в DataGrid
.
Чтобы полностью отключить выбор строк в 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" отключает все взаимодействие с строками, включая редактирование.
Однако, если все, что вы хотите сделать, это изменить стиль строки при выборе, просмотрите ответы здесь.
Все вышеперечисленное - хорошие идеи для простых хаков. Однако они не выполняют именно то, что задают. Другие ответы говорят нам о том, как отменить выбор, выбранный пользователем, или скрыть тот факт, что пользователь выбрал что-то.
Однако я понимаю, почему эти ответы даны. Это непросто обеспечить реальное решение.
Реальное решение состоит в том, чтобы предотвратить выбор в первую очередь, что не просто, но это выполнимо с помощью нескольких простых шагов.
Ответ 1. Вы должны скопировать стиль в Expression Blend (или найти копию стиля где-нибудь). 2. Измените один параметр ItemPresenter. Мне было достаточно установить IsHitTestVisible = "False" на ItemPresenter.
Если вам нужна дополнительная информация или углубленная прогулка для этого, см. мой пост в блоге:
Как указано Sonic Soul здесь, решение viky на самом деле не работает.
Вот фактический рабочий код для отключения выбора в DataGrid:
grid.SelectionChanged += (obj, e) =>
Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() =>
grid.UnselectAll()));
Еще один простой способ - изменить стиль выделения с помощью переключателя IsSelected Trigger to Transparent.
Если вы используете альтернативные цвета:
<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>
Единственный правильный способ, который я нашел для этого, - отключить свойство IsHitTestVisible в стиле DataGrid Строка.
Событие клика по-прежнему регистрируется, несмотря на именование. Убедитесь, что вы не изменяете это свойство во всем DataGrid, если вы также не хотите отключать прокрутку.
Чистый способ сделать это через новый стиль в ваших статических ресурсах (копируя другие настройки, если это необходимо)
<Style x:Key="DataGridUnselectableRowStyle" TargetType="{x:Type DataGridRow}">
<Setter Property="IsHitTestVisible" Value="False"/>
</Style>
а затем привязывая его к вашему DataGrid
<DataGrid
RowStyle="{StaticResource DataGridUnselectableRowStyle}" >
<!-- Contents -->
</DataGrid>
Если кто-то сталкивается с такой же проблемой, они могут оказаться полезными.
У нас было требование отключить несколько строк в datagrid, но в то же время разрешить навигацию по ним на СТРЕЛКЕ. Вот почему нам пришлось переключиться на "IsHitTestVisible" вместо управления свойством IsEnabled. Таким образом, мы не смогли принять решение выше о переключении на свойство IsEnable.
Вот как я решил решить эту проблему. Я создал новое прикрепленное свойство (RowEnable) для DataGridRow. Это прикрепленное свойство может быть привязано к свойству viewmodel для управления "виртуальным" включением и отключением. Я также создал новый стиль для DataGridCell, где я устанавливаю 'IsHitTestVisible' в false, основываясь на том же свойстве viewmodel. Итак, рассмотрите его как строку, которую может видеть мышь/клавиатура, но не можем видеть ее ячейки/столбцы. Это означает, что теперь я могу создать строку на основе нового прикрепленного свойства (RowEnabled), чтобы выглядеть отключенным/включенным. В то же время я могу просматривать подсказки для этих строк, которые практически отключены.
Мне нужен код для решения. Это работает для меня:
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;