Редактируемый DataGrid - CanUserAddRows=True не работает

У меня есть следующий DataGrid:

 <DataGrid ItemsSource="{Binding EmployeeList}" CanUserAddRows="True" AutoGenerateColumns="False" Margin="0,0,0,90">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="CountryCombo2">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding Path=DataContext.CountryList, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" 
                                      DisplayMemberPath="CountryName" 
                                      SelectedItem="{Binding EmployeeCountry, Mode=TwoWay}"
                                      SelectedValue="{Binding EmployeeCountry.CountryId}"
                                      SelectedValuePath="CountryId" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

Однако я не могу добавить новые строки в DataGrid. Пожалуйста, дайте мне знать, если мне нужно предоставить какой-либо дополнительный код.

Обновление:

Экран 1: это снимок экрана, когда окно только что загружено с жестко заданными значениями свойств. Теперь я вижу пустую новую строку.

Экран 1

Экран 2: Здесь я добавил данные в новую строку со значениями Рэмбо и Россия. Теперь, что бы я ни делал (табуляция, щелчок в другой ячейке), следующая новая строка не добавляется. Я считаю, что это должно добавить новую строку.

Экран 2

Экран 3: Здесь новые добавленные значения строки исчезли. Это потому, что я дважды щелкнул по тонкой границе между двумя пустыми ячейками. Теперь это довольно странно.

Экран 3

Экран 4: теперь, когда я нажимаю на ячейку Питера, ранее введенные данные строки возвращаются, но теперь они смещаются вниз, а перед ними вставляется новая пустая строка. Это очень странно.

Экран 3

Может ли кто-нибудь помочь мне понять это поведение DataGrid.


person Lucifer    schedule 11.03.2014    source источник
comment
Просто чтобы быть уверенным, вы видите пустую строку в нижней части вашего DataGrid, верно? Что должно произойти, так это то, что если вы что-то введете в эту строку, то новая строка автоматически появится внизу DataGrid. Это то поведение, которое вы ожидаете и не видите? Извините, если это кажется очевидным вопросом, но иногда не очевидно, чего ожидают люди.   -  person ouflak    schedule 11.03.2014
comment
Да, @oflak, я ожидаю именно такого поведения. Но я не получаю, чтобы эта новая строка автоматически появлялась внизу DataGrid.   -  person Lucifer    schedule 11.03.2014
comment
Каков тип вашего ItemsSource? Тип T должен иметь конструктор без параметров. Я попробую, когда вернусь в свой офис.   -  person ouflak    schedule 12.03.2014
comment
Я пропустил конструктор без параметров. Спасибо, что указали на это. Хотя я столкнулся с еще одной странной проблемой с DataGrid. Пожалуйста, обратитесь к части обновления моего вопроса.   -  person Lucifer    schedule 12.03.2014
comment
Вы уже обновились? Не вижу... Возможно, обновление не работает....   -  person ouflak    schedule 12.03.2014
comment
@oflak, я обновил вопрос. С моей стороны была небольшая задержка ;)   -  person Lucifer    schedule 12.03.2014


Ответы (3)


В моем случае,

Сначала убедитесь, что ваш ItemSource не использует array, который не может добавить к нему новый элемент,

используйте что-то вроде List, которое может добавить newItem,

Кроме того, SomeClass должен иметь конструктор по умолчанию, не принимающий такие параметры, как

List<SomeClass>();

public Class SomeClass
{       
  public SomeClass() { }
}

затем новая пустая строка появится внизу DataGrid.

См. этот ответ.

person yu yang Jian    schedule 21.03.2017

Я продолжаю и публикую это как ответ здесь, так как мне нужно опубликовать пример кода, и комментарии начинают расширяться (получил сообщение с приглашением в чат).

Ответ на первоначальный вопрос заключался в том, чтобы убедиться, что тип T ItemsSource имеет конструктор без параметров.

Попробуйте этот код, прикрепленный к событию BeginningEdit DataGrid, чтобы поглотить щелчки границы ячейки:

private void Grid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
    //// Have to do this in the unusual case where the border of the cell gets selected
    e.Cancel = true;
}

Если вы на самом деле используете этот обработчик для чего-то другого или собираетесь это делать, вы можете проверить OriginalSource, чтобы узнать, является ли он границей, и отменить событие при этом условии.

person ouflak    schedule 12.03.2014
comment
Это решает проблему, но частично. Я все еще не могу добавить какие-либо дополнительные строки. - person Lucifer; 12.03.2014
comment
Итак, теперь вы можете видеть исходную пустую строку. Вы можете отредактировать его. Но автоматически не создается дополнительная строка? Это правильно? - person ouflak; 12.03.2014
comment
Кто-нибудь может воспроизвести проблему? Или я что-то не так делаю? - person Lucifer; 12.03.2014
comment
Я воспроизвел его, но в данный момент я немного занят несколькими вещами, и я, честно говоря, немного застрял в том, что делать дальше. У меня есть некоторые неуклюжие идеи, такие как обработка события Cell's Selected и добавление нового «пустого» элемента в ItemsSource или что-то в этом роде. Но что-то подобное действительно было бы только для тестирования. Встроенный функционал должен работать. пожал плечами - person ouflak; 12.03.2014

Используйте DataGridTextColumn и DataGridComboBoxColumn вместо DataGridTemplateColumn, тогда строки будут добавлены соответствующим образом.

Если вы хотите использовать DataGridTemplateColumn, установите не только CellTemplate, но и CellEditingTemplate. Например:

<DataGridTemplateColumn Header="Pick a Date">
<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding myDate}" />
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
        <DatePicker SelectedDate="{Binding myDate}" />
    </DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>

person Mentor    schedule 07.05.2014