2012-02-20 8 views
0

DataGridCellスタイルに対してIsTabStopがfalseに設定されているデータグリッドがあります。これは、タブを押したときにすべてのデータグリッドセルに集中するのを避けるために行われました。フォーカスがあるときのデータグリッドセルのフォーカス

タブを押すことでハイパーリンクとラジオ​​ボタンに集中できますが、そのとき行が選択されません。私は次のコードを試しました:

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

EDIT:

あなたのデータグリッドの名前がある

<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

関連する問題