您應該使用數據網格的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;
}
}
}
萬一多個單元格選擇,最後單元格的行將被選中。您可以修改它以適應您的需求。
不幸的是,我不能使用這個。使用事件設置器需要爲樣式聲明的類名稱。這些樣式在多個視圖中共享,因此它們不能具有類屬性。 – 2012-02-21 03:34:06
嗨,我修改了答案來解決這個問題。我自己測試它,所以我可以告訴它它的工作原理。 – Natxo 2012-02-21 10:18:14