我看到一些可用于行选择的选项,但“无选择”不是其中之一。我尝试通过将 SelectedItem 设置为 null 来处理 SelectionChanged 事件,但该行似乎仍然被选中。
如果没有简单的支持来防止这种情况发生,那么将选定行的样式设置为与未选定行相同是否容易?这样可以选择它,但用户没有视觉指示器。
我看到一些可用于行选择的选项,但“无选择”不是其中之一。我尝试通过将 SelectedItem 设置为 null 来处理 SelectionChanged 事件,但该行似乎仍然被选中。
如果没有简单的支持来防止这种情况发生,那么将选定行的样式设置为与未选定行相同是否容易?这样可以选择它,但用户没有视觉指示器。
您必须使用 BeginInvoke 异步调用 DataGrid.UnselectAll 才能使其工作。我编写了以下附加属性来处理此问题:
using System;
using System.Windows;
using System.Windows.Threading;
using Microsoft.Windows.Controls;
namespace DataGridNoSelect
{
public static class DataGridAttach
{
public static readonly DependencyProperty IsSelectionEnabledProperty = DependencyProperty.RegisterAttached(
"IsSelectionEnabled", typeof(bool), typeof(DataGridAttach),
new FrameworkPropertyMetadata(true, IsSelectionEnabledChanged));
private static void IsSelectionEnabledChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var grid = (DataGrid) sender;
if ((bool) e.NewValue)
grid.SelectionChanged -= GridSelectionChanged;
else
grid.SelectionChanged += GridSelectionChanged;
}
static void GridSelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
var grid = (DataGrid) sender;
grid.Dispatcher.BeginInvoke(
new Action(() =>
{
grid.SelectionChanged -= GridSelectionChanged;
grid.UnselectAll();
grid.SelectionChanged += GridSelectionChanged;
}),
DispatcherPriority.Normal, null);
}
public static void SetIsSelectionEnabled(DataGrid element, bool value)
{
element.SetValue(IsSelectionEnabledProperty, value);
}
public static bool GetIsSelectionEnabled(DataGrid element)
{
return (bool)element.GetValue(IsSelectionEnabledProperty);
}
}
}
我在创建我的解决方案时参考了这篇博文。
请将以下样式应用于 datagid 单元格以解决问题:
<Style x:Key="MyDatagridCellStyle" TargetType="{x:Type Custom:DataGridCell}">
<Setter Property="Focusable" Value="false"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="#434342"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="FontFamily" Value="Arial"/>
<Setter Property="FontSize" Value="11"/>
<Setter Property="FontWeight" Value="Normal"/>
</Style>
使用属性“IsHitTestVisible”作为 False 可以避免任何行选择。但它不允许您使用数据网格的滚动条。在这种情况下,Datagrid 将被锁定。另一种解决方案是:您可以将样式应用于数据网格的单元格。它对我有用。请使用如下代码:
上面的代码对我有用。希望它也对你有用。
问候, Vaishali