ユーザーがグリッド内の (編集可能な) セルをクリックできるようにする必要があり、F2 キーをダブルクリックする必要はなく、すぐに編集モードになります。これを行うために、次の動作を追加しました。
public class AutomaticallyEditGridBehavior : Behavior<DataGrid>
{
protected override void OnAttached()
{
base.OnAttached();
if (AssociatedObject.IsReadOnly)
{
return;
}
AssociatedObject.CurrentCellChanged += OnCurrentCellChanged;
}
private void OnCurrentCellChanged(object sender, EventArgs e)
{
// Check our column is not readonly first
if (AssociatedObject.CurrentColumn.IsReadOnly)
{
return;
}
AssociatedObject.BeginEdit();
}
}
セルが編集されたときのロジックもいくつかあるので、別の動作を追加しました。
public class CellEditEndedBehavior : Behavior<DataGrid>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.CellEditEnded += CellEditEnded;
}
private void CellEditEnded(object sender, DataGridCellEditEndedEventArgs e)
{
if (e.EditAction != DataGridEditAction.Commit)
{
return;
}
if (AssociatedObject.SelectedItem == null)
{
return;
}
// Some processing and logic to get next editable item
// Set the focus to the next item and begin editing
AssociatedObject.SelectedItem = nextEditableItem;
AssociatedObject.CurrentColumn = e.Column;
AssociatedObject.Focus();
AssociatedObject.BeginEdit();
}
}
セルをクリックすると最初の動作が実行されますが、そのセルを編集する前に CellEditEnded イベントが発生します。したがって、フォーカスは、クリックされたばかりのセルではなく、次のオブジェクトに移動します。
セルが実際に編集される前に、このイベントが発生するのはなぜですか? これを行うより良い方法はありますか?