Группировка обновлений WPF Datagrid после редактирования / обновления элемента

Я относительно новичок в WPF, и мне было интересно, может ли кто-нибудь мне помочь.

У меня есть представление коллекции, в котором хранится список наблюдаемых коллекций, в котором хранятся все мои элементы. Источником элемента моего datagrid является представление коллекции. У меня простая группировка в XAML datagrid ...

            <DataGrid.GroupStyle>
            <GroupStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding Name}" FontWeight="Bold" Padding="3"/>
                        </StackPanel>
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
            </GroupStyle>
        </DataGrid.GroupStyle>

Теперь ... добавление / удаление элементов работает нормально, однако всякий раз, когда я обновляю / редактирую элемент, группы не обновляются. Скажем, например, элементы сгруппированы по городу, если у меня есть 3 элемента под одним названием города "Сиэтл", тогда измените одно из этих названий города на "Бруклин", город "Бруклин" останется в группе Сиэтла, пока я не заполню список наблюдаемой коллекции. .

Моя текущая работа ... заключается в том, что всякий раз, когда город меняется, я буквально очищаю и повторно заполняю свой наблюдаемый список коллекций для обновления групп ... Должен быть лучший способ!

Мой вопрос: есть ли способ обновить группу данных вручную / динамически всякий раз, когда я обновляю / редактирую элемент?

Примечание. INotifyPropertyChanged. Я на 90% уверен, что проблема не в этом. Я пробовал всевозможные комбинации с этим интерфейсом, группы не будут обновляться всякий раз, когда я редактирую / обновляю элементы. Однако всякий раз, когда я добавляю элемент, если это новый город, будет создана новая группа, если я удалю все элементы в городе, эта группа городов также будет удалена. Кроме того, это не только конкретные элементы, это любой столбец с элементами.

РЕДАКТИРОВАТЬ хорошо, по-прежнему нет решения ... но я нашел другую работу, которая, опять же, не самая элегантная. Я помещаю обработчик событий для поля города ... поэтому всякий раз, когда изменяется город, вызывается обработчик событий, и я обновляю представление коллекции. Однако событие вызывается всякий раз, когда я добавляю элемент, вызывается, когда я щелкаю по элементу, и вызывается дважды, когда я вношу изменение, так что это не всегда эффективно ... все еще ищу идеи.

EDIT2. Сейчас я изучаю BeginEdit и EndEdit IEditableObject, чтобы узнать, даст ли это мне то, что мне нужно.

Любая помощь очень ценится, спасибо!


person Ben Cheng    schedule 09.10.2013    source источник


Ответы (2)


Хорошо, хорошо .... Я не мог найти прямой способ обновить группировку, когда обновлял свои элементы. Однако я нашел способ обойтись ... Я реализовал событие, которое запускается всякий раз, когда я изменяю текст в текстовом поле, внутри события и после некоторой проверки я вызываю метод refresh () в обзоре коллекции и обновлениях группировки.

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

Если у кого-то еще есть какие-либо решения или идеи, пожалуйста, дайте мне знать, поскольку мне придется придерживаться этого решения на данный момент :(

РЕДАКТИРОВАТЬ Решение с использованием псевдокода, если кому-то интересно ...

Когда текстовое поле получает фокус, установите для флага редактирования значение true, чтобы никакие транзакции в текстовом поле не могли происходить во время редактирования.

Когда текстовое поле теряет фокус, установите флаг редактирования false, убедитесь, что текущий текст отличается от предыдущего текста.

если текущий текст в текущем текстовом поле отличается, обновите объект коллекции

person Ben Cheng    schedule 10.10.2013
comment
Не могли бы вы опубликовать свое решение для кода. Мне интересно, сможете ли вы подавить каскадирование вызовов до вашего события TextChanged, установив для своего свойства события Handled значение true. - person ouflak; 11.10.2013
comment
Я думаю, вам нужен флаг в событии GotFocus текстового поля. Я не уверен, что это правильное событие. Однако, если флаг установлен, в событии изменения текста ничего не обрабатывается, пока текстовое поле находится в фокусе. Однако, как только текстовое поле теряет фокус, вы можете проверить наличие изменений или сделать что-нибудь еще. - person Ben Cheng; 11.10.2013

Я столкнулся с той же проблемой. Получил, что он работает с ObservableCollectionImplementation, который дает изменения элементов с помощью отдельного обработчика событий (см. здесь ). Итак, внутри ViewModel я просто подписываю ItemPropertyChanges в обработчике событий и заставляю все обновляться.

Может еще кому-то поможет.

С Уважением!

public class MyViewModel: ViewModelBase
{
  ObservableCollectionEx<IEditableItem> _rawsource;
  ICollectionView _viewSource;

  public MyViewModel (ObservableCollectionEx rawDataSource)
  {
    this._rawsource = rawDataSource;
    this._rawsource.ItemPropertyChanged += new PropertyChangedEventHandler(RawSource_ItemPropertyChanged);

    // Create the CollectionView
    this._viewSource = new ListCollectionView(this._rawsource);
  }

  void RawSource_ItemPropertyChanged(object sender, PropertyChangedEventArgs e)
  {
    // Check if this is a Collection of EditableObjects - so a CommitEdit can be fired
if (this._viewSource is IEditableCollectionView)
    {
      var so = this._viewSource as IEditableCollectionView;
      so.CommitEdit();
    }

// CollectionView refresh
this._viewSource.Refresh();
  }

  // Here is our Bindable object
  public ICollectionView ItemSourcer
  {
get
{
  return this._viewSource;
}
  }

 // ...

}
person G.Monga    schedule 08.01.2014