2012-02-20 117 views
0

我有一個DataGrid的IsTabStop設置爲DataGridCell樣式爲false。這是爲了避免在按Tab時關注每個數據網格單元格。聚焦數據網格單元格時,焦點在

現在,我可以通過按Tab鍵關注超鏈接和單選按鈕,但是當我這樣做時,該行不會被選中。我試了下面的代碼:

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

儘管看起來這段代碼沒有效果。請提出任何可能的解決方法。

回答

0

您應該使用數據網格的SelectedItem屬性。當然,檢查SelectionUnit沒有被設置爲 「細胞」

試試這個:

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

如果myDatagrid是你的DataGrid的名稱:

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

編輯:

如果你需要一個更可重用的東西,我建議使用附加的行爲。在這種情況下,我將創建一個附加的行爲在DataGrid本身使用:

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

這是代碼,它都可以監控SelectedCellsChanged事件DataGrid的變化:

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

萬一多個單元格選擇,最後單元格的行將被選中。您可以修改它以適應您的需求。

+0

不幸的是,我不能使用這個。使用事件設置器需要爲樣式聲明的類名稱。這些樣式在多個視圖中共享,因此它們不能具有類屬性。 – 2012-02-21 03:34:06

+0

嗨,我修改了答案來解決這個問題。我自己測試它,所以我可以告訴它它的工作原理。 – Natxo 2012-02-21 10:18:14

相關問題