我有一个DataGrid,对于DataGridCell样式,IsTabStop设置为false。这样做是为了避免在按Tab键时关注每个datagrid单元格。
现在,我可以通过按Tab键来关注超链接和单选按钮,但是当我这样做时,行不会被选中。我尝试了以下代码:
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="IsSelected" Value="True" />
</Trigger>
</Style.Triggers>
</Style>
虽然看起来这个代码没有效果。请提出任何可能的解决方法。
答案 0 :(得分:0)
您应该使用datagrid的SelectedItem
属性。当然,检查SelectionUnit
未设置为“cell”
试试这个:
<Style TargetType="{x:Type DataGridCell}">
<EventSetter Event="GotFocus" Handler="DataGridCell_GotFocus"></EventSetter>
</Style>
如果myDatagrid
是您的数据网格的名称:
private void DataGridCell_GotFocus(object sender, EventArgs e)
{
DataGridCell cell = sender as DataGridCell;
myDatagrid.SelectedItem = cell.DataContext;
}
修改强>
如果您需要更可重用的内容,我建议使用附加行为。在这种情况下,我将创建一个在数据网格本身中使用的附加行为:
<Style TargetType="{x:Type DataGrid}">
<Setter Property="views:MyBehaviours.IsCellRowSelected" Value="true"></Setter>
</Style>
这是代码,它将监视datagrid的SelectedCellsChanged
事件的更改:
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;
}
}
}
如果选择多个单元格,将选择最后一个单元格的行。您可以根据自己的需要进行修改。