如何防止WPF Toolkit DataGrid中的行选择?

时间:2010-05-04 12:54:29

标签: wpf wpftoolkit wpfdatagrid

我看到一些可用于行选择的选项,但“No Selection”不是其中之一。我已经尝试通过将SelectedItem设置为null来处理SelectionChanged事件,但似乎仍然选中了该行。

如果没有简单的支持来防止这种情况,那么将所选行的样式设置为与未选择的行相同是否容易?这样就可以选择,但是用户没有可视指示符。

3 个答案:

答案 0 :(得分:5)

您必须使用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);
        }
    }
}

我在创建解决方案时采购this blog post

答案 1 :(得分:1)

请将以下样式应用于datagrid单元以解决问题:

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

答案 2 :(得分:0)

使用属性“IsHitTestVisible”作为False可以避免任何行选择。但它不允许您使用数据网格的滚动条。在这种情况下,Datagrid将被锁定。 另一种解决方案是 您可以将样式应用于datagrid的单元格。它对我有用。请使用以下代码:                                                            
              上面的代码对我有用。希望它也适合你。

此致 费沙