Вы должны использовать свойство SelectedItem
сетки данных. Конечно, убедитесь, что SelectionUnit
не установлен на «ячейку»
Попробуйте это:
<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;
}
EDIT:
Если вам нужно что-то более пригодное для повторного использования, я предлагаю использовать прикрепленное поведение. В этом случае я бы создал прикрепленное поведение, которое будет использоваться в самой сетке данных:
<Style TargetType="{x:Type DataGrid}">
<Setter Property="views:MyBehaviours.IsCellRowSelected" Value="true"></Setter>
</Style>
Это код, он будет отслеживать изменения в событии 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;
}
}
}
В случае выбора нескольких ячеек будет выбрана строка последней ячейки. Вы можете изменить это в соответствии со своими потребностями.