Чи слід прив'язувати DataGrid
до
ICollectionView = CollectionViewSource.GetDefaultView(collection)
або до
ObservableCollection<T> collection;
???
Яка найкраща практика для MVVM і чому?
Чи слід прив'язувати DataGrid
до
ICollectionView = CollectionViewSource.GetDefaultView(collection)
або до
ObservableCollection<T> collection;
???
Яка найкраща практика для MVVM і чому?
Відповіді:
Ви завжди прив’язуєтесь до an ICollectionView
, незалежно від того, робите це явним чи ні.
Припустимо, що ми маємо
var collection = new ObservableCollection<string>();
var collectionView = CollectionViewSource.GetDefaultView(collection);
У цьому випадку прив’язка до collection
або до collectionView
є одним і тим самим: механізм прив’язки прив’яжеться до подання колекції за замовчуванням (до якого відповідає посилання collectionView
), якщо ви скажете йому прив’язатись collection
.
Це означає, що відповідь на ваше запитання: "це абсолютно не має значення".
Щоб бути абсолютно зрозумілим: навіть якщо ви прив'язуєтесь до колекції безпосередньо, механізм прив'язки прив'язуватиметься до подання за замовчуванням. Модифікація властивостей подання, таких як критерії сортування, впливатиме на прив’язку, яка, здається, прив’язується безпосередньо до колекції, оскільки за обкладинками це прив’язка до подання за замовчуванням.
Однак є ще одне цікаве і пов’язане питання: чи слід прив’язуватись до подання колекції за замовчуванням (тобто до самої колекції, оскільки немає причин явно пов’язувати її до подання за замовчуванням) або до іншого подання тієї ж колекції?
Враховуючи, що кожне представлення має своє поняття поточного елемента, критерії сортування тощо, випливає, що якщо ви маєте намір мати кілька прив’язок до однієї колекції, а зв’язані елементи керування повинні мати різні поняття поточного елемента, фільтрів та компанії, тоді що ви хочете, це явно прив’язати до декількох подань однієї і тієї ж базової колекції.
ObservableCollection<T>
реалізує INotifyCollectionChanged
та повідомлятиме інтерфейс користувача, коли елементи у колекції будуть змінені.
ICollectionView
надасть вам можливість фільтрувати, сортувати або групувати колекцію на додаток до INotifyCollectionChanged
подій, що розповсюджуються, якщо основна колекція це реалізує.
Будь-який тип добре працює з MVVM, якщо ви до нього прив’язані. Використовуйте, ICollectionView
коли вам потрібно сортувати, фільтрувати або групувати. Використовуйте ObservableCollection<T>
безпосередньо, коли ні.
Просто щоб додати до того, що сказав Джон. Головна відмінність полягає в тому, що, використовуючи CollectionViewSource.GetDefaultView(collection)
, ви ставите залежність ViewModel від WPF. Багатьом пуристам MVVM це не подобається, і це залишило б ObservableCollection лише дійсним варіантом.
Іншим варіантом буде використання ICollectionView
та використання класу, який реалізує його, але не є частиною самого WPF.
Я не думаю, що він повинен щось робити із MVVM
собою. ICollectionView
надає додаткові функції , такі як Söring угруповання і т.д. , якщо вам потрібно використовувати ті , в IColectionView
іншому випадку просто використовуватиObservableCollection
Ви повинні прив’язатись до подання, якщо хочете, щоб ваша сітка відображала налаштування, застосовані до подання, наприклад, фільтрування, інакше подання зайве.