2010-05-04 8 views
4

행 선택에 사용할 수있는 몇 가지 옵션이 있지만 '선택 없음'은 그 중 하나가 아닙니다. SelectedItem을 null로 설정하여 SelectionChanged 이벤트를 처리해 보았지만 여전히 행이 선택된 것으로 보입니다.WPF Toolkit DataGrid에서 행 선택을 방지하려면 어떻게합니까?

쉽게 방지 할 수없는 경우 선택한 행을 선택 취소 한 것과 같은 스타일로 쉽게 고칠 수 있습니까? 그렇게하면 선택 될 수 있지만 사용자에게는 시각적 표시기가 없습니다.

+0

당신이 그것을 읽기 전용으로 만들 하시겠습니까을? – Archie

+0

이미 읽기 전용입니다. 나는 세포의 성질을 통해 그것을 쉽게 할 수 있었다. 난 그냥 행 선택을 허용하고 싶지 않아. 선택한 행을 선택되지 않은 행과 동일한 스타일로 지정하는 것이 대답 일 수 있다고 생각하기 시작했습니다. – Kilhoffer

답변

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을 공급.

+0

이것은 이상한 문제에 대한 멋진 해결책입니다. 내가 너를 두 번 이상 상 회할 수 있다면, 나는 그렇게 하겠어! 완벽하게 일했습니다. – Kilhoffer

+0

+1하지만 꽤 해킹 된 :-) – Karsten

0

'IsHitTestVisible'속성을 False로 사용하면 모든 행 선택을 피할 수 있습니다. 그러나 그것은 당신이 당신의 DataGrid의 스크롤바를 사용하는 것을 허용하지 않을 것입니다. 이 경우 Datagrid가 잠길 것입니다. 다른 해결책은 다음과 같습니다. DataGrid의 셀에 스타일을 적용 할 수 있습니다. 그것은 나를 위해 일했습니다. 아래 코드를 사용하십시오 : 코드 위
나를 위해 일했다. 그것이 당신을 위해 또한 작동하기를 바랍니다.

감사합니다, 문제를 해결하기 위해 datagid 셀에 스타일 아래에 신청 해주세요

1

바이 샬리 :

<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> 
관련 문제