一千萬個為什麽

搜索

如何防止WPF Toolkit DataGrid中的行選擇?

我看到一些選項可用於行選擇,但“No Selection”不是其中之一。我已經嘗試通過將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);
        }
    }
}

我采購此博客文章創建我的解決方案。

轉載註明原文: 如何防止WPF Toolkit DataGrid中的行選擇?