2

WPF DataGrid で奇妙な問題に直面しています。最初のセルをクリックして値を入力し、タブで次のセルに移動した場合、最初のセルは編集モードを終了しません。以下のテンプレートの簡略版を使用して問題を再現しました。

<DataGrid Name="grid" HorizontalAlignment="Stretch" ItemsSource="{Binding Persons}" Margin="0,10,0,0" VerticalAlignment="Stretch" AutoGenerateColumns="False" CanUserAddRows="True">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="FirstName">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding FirstName}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding FirstName}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="LastName">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding LastName}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding LastName}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Age">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Age}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Age}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

ダミー クラスの定義は次のとおりです。

 public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

背後にあるコードは次のとおりです。

 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;

        Persons = new ObservableCollection<Person>();
        this.grid.CurrentCellChanged += grid_CurrentCellChanged;
        this.grid.PreparingCellForEdit += grid_PreparingCellForEdit;
    }

    void grid_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
    {
        if (e.EditingElement != null)
            SetFocusToTextBox(e.EditingElement);
    }

    void grid_CurrentCellChanged(object sender, EventArgs e)
    {
        ((DataGrid)sender).BeginEdit();
    }

    public ObservableCollection<Person> Persons { get; set; }

    void SetFocusToTextBox(object obj)
    {
        // Get all children and examine if the child is a TextBox
        object obChild;
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj as DependencyObject); i++)
        {
            obChild = VisualTreeHelper.GetChild(obj as DependencyObject, i);
            if (obChild is TextBox)
            {
                ((TextBox)obChild).Focus();
                break;
            }
            else
                SetFocusToTextBox(obChild);
        }
    }

誰かがここで何が悪いのか分かりますか? 問題を再現できますか? どんな助けでも大歓迎です。

ありがとう、バヌ

4

1 に答える 1

1

DataGrid XAML 定義は 100% 正しいです。問題はコード ビハインドにあるはずです。私の最善の推測は CurrentCellChanged です。2回上げることができました。1 つ目はセルを離れたとき、2 つ目は新しいセルが選択されたときです。その場合、イベントの状態をチェックしていないため、フォーカスを失ったセルを編集モードに戻しています。

簡単なデバッグでこれを確認できるはずです - ブレークポイントを置いて、
((DataGrid)sender).BeginEdit()それが呼び出される回数を数えます。

私は個人的に BeginEdit に次のコードを使用していますが、問題なく動作します。

private void dataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
     if (e.AddedCells.Count > 0 && !this.dataGrid.IsReadOnly)
     {
         this.dataGrid.BeginEdit();
     }
}
于 2014-03-08T22:12:58.800 に答える