в wpf datagrid, как получить пустую строку на вершине? т.е. когда пользователь хочет добавить новую строку, она всегда прибывает внизу. Но я хочу, чтобы это было на вершине... я могу сделать это в XAML?
Этот ответ во многом зависит от того, как вы привязываете свой DataGrid, в частности от того, какой базовый тип вашего ItemsSource. В этом ответе предполагается, что вы используете ObservableCollection . Поскольку вы конкретно упоминаете WPF, я также предполагаю, что вы имеете в виду .NET 4.0, поскольку DataGrid доступен только в Silverlight 3 и .NET 4.0.
Я предполагаю, что вы создаете новую строку, вызывая
ItemSource.Add(new MyObject());
. Чтобы получить желаемое поведение, используйте вместо этого следующее:
ItemSource.Insert(0, new MyObject());
Вам нужно будет написать свой собственный шаблон для DataGrid, где вы бы поместите часть NewItemPlaceholder поверх сетки. Для начала посмотрите на этот пример (хотя этот пример не является ответом, он укажет вам правильное направление).
Кстати, позвольте мне спросить, зачем вам нужно, чтобы NewItemPlaceholder был наверху? Это как бы нарушает естественный поток сверху вниз, который мы так привыкли видеть при работе со списками / сетками.
Возможно, будет более интуитивно понятным иметь элемент «Новый элемент» внизу и параметр «Вставить элемент» в контекстном меню для сетки или что-то в этом роде. Это, конечно, только мое мнение.
Если вы используете подход MMVM, вы можете добавить новую строку программно, например:
var newEmp = new EmployeeViewModel(new EmployeeDto());
EmployeeList.Add(newEmp);
EmployeeList.Move(EmployeeList.IndexOf(newEmp), 0);
В моем примере я использую EmployeeListViewModel для отображения ObservableCollection из EmployeeViewModels.
Тогда вы также можете писать тесты для этого поведения. Больше контроля, чем в XAML ....
/ Johan
А как насчет NewItemPlaceholderPosition.AtBeginning ? У меня нет примера кода, но, похоже, вы это описываете. Вы всегда можете сделать то, что предлагает Йохан, и программно переместить или отсортировать элементы в сетке.
Пример кода, добавленный Рэем Бернсом:
var view = CollectionView.GetDefaultCollectionView(EmployeeList)
as IEditableCollectionView;
if(view!=null)
view.NewItemPlaceholderPosition = NewItemPlaceholderPosition.AtBeginning;
Обратите внимание, что для этого требуется NET Framework 3.5 или выше.