Как сохранить свойства отдельных коллекций в синхронизации? - PullRequest
0 голосов
/ 21 сентября 2011

У меня есть приложение WPF с экраном, содержащим элемент управления вкладками с двумя вкладками.На каждой вкладке находится сетка данных, каждая из которых связана с ObservableCollection объектов Part.У детали есть несколько «количественных» свойств, которые необходимо синхронизировать между сетками.Например, если пользователь изменяет количество partABC на grid1, partABC либо необходимо добавить в grid2 с таким же количеством, либо, если grid2 уже содержит partABC, его количество необходимо изменить, чтобы отразить grid1.

Моя проблема в том, что это должно работать в обоих направлениях.Если я установлю обработчик PropertyChanged для каждой части в обеих сетках, я получу бесконечный цикл, поскольку они постоянно обновляют количества друг друга.До сих пор я занимался этим во время события изменения выбора элемента управления вкладками, просто перебирая один из списков и устанавливая количества по одному.Это работало достаточно хорошо, пока я не понял, что пользователи могут потенциально добавлять тысячи деталей в свои списки, и на этом этапе этот процесс занимает недопустимое количество времени (около 25 секунд для 4500 объектов деталей).

edit
Первая сетка содержит каждую часть в базе данных, которая служит своего рода «списком выбора», где пользователи просто прокручивают до нужной части и вводят количества.Вторая сетка содержит только те детали, которые были введены пользователем вручную, если они предпочитают вводить номера нужных деталей.Grid2 всегда является подмножеством grid1.

1 Ответ

1 голос
/ 21 сентября 2011

Вы можете сделать это с помощью привязки данных. Вы не должны создавать дубликаты объектов Part. Вместо этого продублируйте коллекции, в которых хранятся детали.

Part sharedPart = new Part();
Part onlyInTabA = new Part();
Part onlyInTabB = new Part();

ObservableCollection<Part> tabAParts = new ObservableCollection<Part>() { sharedPart, onlyinTabA };
ObservableCollection<Part> tabBParts = new ObservableCollection<Part>() { sharedPar, onlyInTabB };

Теперь используйте tabAParts для привязки данных к сетке на вкладке A и tabBParts для привязки данных к сетке на вкладке B

Если ваш класс Part реализует INotifyPropertyChanged, то изменение свойства sharedPart обновит обе сетки на обеих вкладках. Когда вы добавляете новую деталь, вы можете сделать ее доступной для общего доступа (добавить ее в обе коллекции) или оставить ее для вкладки

...