Как я могу предотвратить выбор строки в DataFrid WPF Toolkit? - PullRequest
4 голосов
/ 04 мая 2010

Я вижу несколько вариантов выбора строки, но «Нет выбора» не является одним из них. Я попытался обработать событие SelectionChanged, установив для SelectedItem значение null, но строка все еще кажется выбранной.

Если нет простой поддержки для предотвращения этого, будет ли легко просто стилизовать выбранную строку так же, как невыбранную? Таким образом, его можно выбрать, но у пользователя нет визуального индикатора.

Ответы [ 3 ]

5 голосов
/ 04 мая 2010

Вы должны вызвать DataGrid.UnselectAll асинхронно с BeginInvoke, чтобы заставить его работать. Я написал следующее прикрепленное свойство для обработки этого:

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);
        }
    }
}

Я получил эту запись в блоге при создании моего решения.

1 голос
/ 23 декабря 2010

Пожалуйста, примените ниже стиль к ячейке данных для решения проблемы:

<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>
0 голосов
/ 07 мая 2010

Любой выбор строки можно избежать, используя свойство IsHitTestVisible как False. Но это не позволит вам использовать полосу прокрутки вашей сетки данных. В этом случае Datagrid будет заблокирован. Другое решение: Вы можете применить стиль к ячейке сетки данных. Это сработало для меня. Пожалуйста, используйте код, как показано ниже:
Выше код работал для меня. Надеюсь, это сработает и для вас.

С уважением, Вайшали

...