2012-02-20 3 views
0

DataGridCell 스타일에 대해 IsTabStop이 false로 설정된 DataGrid가 있습니다. 이것은 탭을 누를 때 모든 DataGrid 셀에 집중하는 것을 피하기 위해 수행되었습니다.포커스가있는 경우 데이터 격자 셀 포커스

이제 탭을 누르면 하이퍼 링크와 라디오 버튼에 집중할 수 있지만 그렇게하면 행이 선택되지 않습니다. 겉보기에,이 코드는 아무런 효과가 없지만

<Style TargetType="{x:Type DataGridCell}"> 
    <Style.Triggers> 
     <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
      <Setter Property="IsSelected" Value="True" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

: 나는 다음과 같은 코드를 시도했습니다. 가능한 해결 방법을 제안하십시오.

답변

0

데이터 격자의 SelectedItem 속성을 사용해야합니다. 물론, SelectionUnit는 "세포"

으로 설정되어 있지 않은지 확인이 시도 :

private void DataGridCell_GotFocus(object sender, EventArgs e) 
{ 
    DataGridCell cell = sender as DataGridCell; 
    myDatagrid.SelectedItem = cell.DataContext; 
} 

편집 :

데이터 그리드의 이름입니다

<Style TargetType="{x:Type DataGridCell}"> 
    <EventSetter Event="GotFocus" Handler="DataGridCell_GotFocus"></EventSetter> 
</Style> 

myDatagrid 경우

좀 더 재사용이 필요한 경우 첨부 된 동작을 사용하는 것이 좋습니다.

public static class MyBehaviours 
{ 
    public static bool GetIsCellRowSelected(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(IsCellRowSelectedProperty); 
    } 

    public static void SetIsCellRowSelected(DependencyObject obj, bool value) 
    { 
     obj.SetValue(IsCellRowSelectedProperty, value); 
    } 

    public static readonly DependencyProperty IsCellRowSelectedProperty = 
     DependencyProperty.RegisterAttached("IsCellRowSelected", 
     typeof(bool), typeof(MyBehaviours), 
     new UIPropertyMetadata(false, OnIsCellRowSelected)); 

    static void OnIsCellRowSelected(DependencyObject depObj, DependencyPropertyChangedEventArgs e) 
    { 
     DataGrid item = depObj as DataGrid; 
     if (item == null) 
      return; 

     if (e.NewValue is bool == false) 
      return; 

     if ((bool)e.NewValue) 
      item.SelectedCellsChanged += SelectRow; 
     else 
      item.SelectedCellsChanged -= SelectRow; 
    } 

    static void SelectRow(object sender, SelectedCellsChangedEventArgs e) 
    { 
     if (e.AddedCells.Count > 0) 
     { 
      DataGrid dg = sender as DataGrid; 
      var cell = e.AddedCells.Last(); 
      dg.SelectedItem = cell.Item; 
     } 
    } 
} 

경우 :이 코드는

<Style TargetType="{x:Type DataGrid}"> 
    <Setter Property="views:MyBehaviours.IsCellRowSelected" Value="true"></Setter> 
</Style> 

, 그것은 데이터 그리드의 SelectedCellsChanged 이벤트에 대한 변경 사항을 모니터링합니다 :이 경우 필자는 데이터 그리드 자체에 사용되는 연결된 동작을 만들 것 여러 셀을 선택하면 마지막 셀의 행이 선택됩니다. 필요에 맞게 수정할 수 있습니다.

+0

불행히도, 저는 이것을 사용할 수 없습니다. 이벤트 설정자를 사용하려면 스타일에 대해 선언 된 클래스 이름이 필요합니다. 이러한 스타일은 여러보기에서 공유되므로 클래스 속성을 가질 수 없습니다. –

+0

안녕하세요, 저는 수정 해답을 수정했습니다. 나는 그것을 스스로 테스트했기 때문에 그것이 효과가 있다고 말할 수있다. – Natxo

관련 문제