Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Silverlight DataGrid BeginEdit方法导致CellEditEnded事件_C#_Silverlight_Datagrid - Fatal编程技术网

C# Silverlight DataGrid BeginEdit方法导致CellEditEnded事件

C# Silverlight DataGrid BeginEdit方法导致CellEditEnded事件,c#,silverlight,datagrid,C#,Silverlight,Datagrid,我有一个要求,用户应该能够点击网格中的一个(可编辑的)单元格,它会立即进入编辑模式,而不必双击F2键。为此,我添加了一个行为: public class AutomaticallyEditGridBehavior : Behavior<DataGrid> { protected override void OnAttached() { base.OnAttached(); if (AssociatedObject.IsReadOnly)

我有一个要求,用户应该能够点击网格中的一个(可编辑的)单元格,它会立即进入编辑模式,而不必双击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();
    }
}
公共类自动调用YeditGridBehavior:Behavior
{
受保护的覆盖无效附加()
{
base.onatached();
if(AssociatedObject.IsReadOnly)
{
回来
}
AssociatedObject.CurrentCellChanged+=OnCurrentCellChanged;
}
private void OnCurrentCellChanged(对象发送方,事件参数e)
{
//首先检查我们的专栏不是只读的
if(AssociatedObject.CurrentColumn.IsReadOnly)
{
回来
}
AssociatedObject.BeginEdit();
}
}
我还有一些编辑单元格的逻辑,因此我添加了另一个行为:

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();
    }
}
公共类CellEditEndedBehavior:行为
{
受保护的覆盖无效附加()
{
base.onatached();
AssociatedObject.CellEditEnded+=CellEditEnded;
}
私有void CellEditEnded(对象发送方,DataGridCellEditEndedEventArgs e)
{
if(e.EditAction!=DataGridEditAction.Commit)
{
回来
}
if(AssociatedObject.SelectedItem==null)
{
回来
}
//获取下一个可编辑项的一些处理和逻辑
//将焦点设置为下一项并开始编辑
AssociatedObject.SelectedItem=nextEditableItem;
AssociatedObject.CurrentColumn=e.列;
AssociatedObject.Focus();
AssociatedObject.BeginEdit();
}
}
我发现,当我单击某个单元格时,第一个行为会运行,但在有机会编辑该单元格之前,CellEditEnded事件已触发。因此,焦点移动到下一个对象,而不是刚刚单击的单元格


为什么在实际编辑单元格之前触发此事件?有更好的方法吗?

为什么不将其合并为一个行为,然后检查是否刚开始编辑,如果是,则忽略提交?我真的很想将这些行为分开,因为我将在多个网格中使用AutomaticallyEditGridBehavior,但是CellEditendeBehavior只针对我的一个网格。只需添加一个属性即可启用CellEditendeBehavior。AutoMoveNext=在需要它的地方为真。这可能就是我要做的。但这并不能解释为什么会发生这种情况——这更像是一种解决办法。