WPF DataGrid - событие для новых рядов? - PullRequest
5 голосов
/ 06 января 2011

Я использую WPF DataGrid ( .Net 3.5 SP 1 версия из Инструментарий )

На какое событие можно подписаться, чтобы обнаружитькогда добавляется новая строка?(например, когда пользователь перемещает курсор вниз или нажимает Enter, в сетку добавляется новая пустая строка).

В конечном итоге я хочу использовать это событие, чтобы вычислить некоторые значения по умолчанию и поместить их в новыйстрока.

Сетка привязана к DataTable, если это имеет какое-либо значение.

Ответы [ 4 ]

10 голосов
/ 26 февраля 2016

Событие, которое вы ищете, является DataGrid.AddingNewItem, событие .Это событие позволит вам настроить новый объект так, как вы хотите, а затем применить его к свойству NewItem объекта AddingNewItemEventArgs.

Xaml:

        <DataGrid Name="GrdBallPenetrations"
              ItemsSource="{Binding BallPenetrationCollection}" 
              SelectedItem="{Binding CurrentSelectedBallPenetration}"
              AutoGenerateColumns="False" 
              IsReadOnly="False"
              CanUserAddRows="True"
              CanUserDeleteRows="True"
              IsSynchronizedWithCurrentItem="True"
              AddingNewItem="GrdBallPenetrations_AddingNewItem">

Код позади:

private void GrdBallPenetrations_AddingNewItem(object sender, AddingNewItemEventArgs e)
    {
        e.NewItem = new BallPenetration
        {
            Id              = Guid.NewGuid(),
            CarriageWay     = CariageWayType.Plus,
            LaneNo          = 1,
            Position        = Positions.BetweenWheelTracks
        };
    }
8 голосов
/ 24 декабря 2012

Объекты сохраняются (вставляются или обновляются), когда пользователь покидает строку, которую он редактировал. Перемещение в другую ячейку в той же строке обновляет соответствующее свойство посредством привязки данных, но пока не сигнализирует о модели (или уровне доступа к данным). Единственное полезное событие - DataGrid.RowEditEnding. Это срабатывает непосредственно перед фиксацией модифицированной строки.

XAML

<DataGrid ... 
          RowEditEnding="MyDataGrid_RowEditEnding">
</DataGrid>

Код позади

private void MyDataGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) 
{    // Only act on Commit
    if (e.EditAction == DataGridEditAction.Commit)
    {
         var newItem = e.Row.DataContext as MyDataboundType;
         if (newItem is NOT in my bound collection) ... handle insertion...
    } 
}

Все кредиты для этого решения идут в Diederik Krolls ( Original Post ). Мое уважение.

8 голосов
/ 06 января 2011

Вместо того, чтобы работать с событиями в вашем Представлении (сетке), я бы рекомендовал вместо этого наблюдать связанный объект и размещать там свою логику.Это сохраняет вашу бизнес-логику с вашими бизнес-объектами .

Поскольку вы привязаны к DataTable, самый простой способ - просто подписаться на DataTable.TableNewRow.

2 голосов
/ 17 марта 2017

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

Таким образом, настройка заключается в том, что у вас есть ObservableCollection<MyViewModel>, который связан с ItemsSource вашей DataGrid.Вам нужно создать MyViewModel самостоятельно в слое модели представления.

Вот как работает DataGrid при автоматическом добавлении строки:

  1. Когда создается пустая строкавнизу он создает новый экземпляр MyViewModel, который будет привязан к строке, вызывая конструктор по умолчанию для типа.Кто знает, почему он это делает, но если MyViewModel не имеет конструктора по умолчанию, он просто не сможет показать эту пустую строку.Это, вероятно, место, где вы застряли, потому что у вас нет конструктора по умолчанию, потому что вам нужно создать объект самостоятельно. К сожалению, вам нужно пойти и добавить один. Еще раз обратите внимание, что если тип элемента является интерфейсом, это обречено на провал.Тип элемента коллекции должен быть конкретным классом с конструктором по умолчанию.
  2. Теперь он ждет, пока пользователь перейдет к редактированию строки, и в этот момент он начинает собственно добавление.
  3. Этоподнимает AddingNewItem: здесь вы можете перехватить операцию добавления и отключить созданный по умолчанию конструктор, который он создал с вашим собственным экземпляром.У AddingNewItemEventArgs.NewItem есть установщик, и вы можете поменять текущий элемент на свой собственный.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...