Re[2]: Связка нескольких контролов через DataContext
От:
Аноним
Дата:
23.04.11 17:31
Оценка:
V>Описанный вариант реализации никуда не годится — слишком сложный и запутанный. И это при том, что описанные два варианта использования тривиальны в реализации на WPF!
V>У нас есть объект, который устанавливается в качестве DataContext где-то на верхнем уровне: в Window или в UserControl. С помощью биндинга или в коде — не важно.
V>1) У объекта есть строковое свойство которое привязывается к TextBox с UpdateSourceTrigger=PropertyChanged. Объект при изменении этого свойства меняет фильтр у другого своего свойства типа ICollectionView (реализуемый с помощью ListCollectionView), которое привязано к DataGrid. Всё — сценарий реализован!
V>Схематично: V>MyObject -> DataContext V>string MyObject.Filter -> TextBox.Text V>ICollectionView My.Object.Data (ObservableCollection<> -> ListCollectionView) -> DataGrid.ItemsSource
V>2) Данными по запросу заполняется коллекция ObservableCollection<>, она никуда не привязывается. Для привязки предназначена её обёртка типа ListCollectionView. У первого такого свойства мы подписываемся на событие CurrentChanged и в обработчике заполняем данными второе свойство, организованное подобным же образом. Оба свойства привязываются к DataGrid-ам, свойство DataGrid.IsSyncronizedWithCurrentItem ставим в true.
V>ICollectionView My.Object.Data1 (ObservableCollection<> data1 -> ListColleых для data2, параметр(ы) из dataView1.CurrentctionView dataView1) -> DataGrid.ItemsSource V>ICollectionView My.Object.Data2 (ObservableCollection<> data2 -> ListCollectionView dataView2) -> DataGrid.ItemsSource V>dataView1.CurrentChanged -> запрос данн
V>И всё! Никто ни о ком ничего не знает, никаких ковыряний в контекстах данных, никаких костылей.
Пока не совсем осознал ваше решение, проблема в том что изначально я не знаю будет ли там text-box и grid, а может будет textbox-combobox.
Т.е. я не могу заранее затачиваться на то какие будут связи, я должен их считать из файла конфигурации и просроить так как написано в конфигурации.
Я просто даю возможность пользователю самому выбрать какие контролы он будет использовать ( что то на подобии CMS ) и хотелось вот использовать синтаксис binding чтобы указывать как их связать.
Т.е. пользователь сам составляет композиции из контролов и устанавливает связи. Т.е. заранее готового объекта Model для его сценария нет, он должен сформироваться динамически.
Пользователь указывает что этот контрол должен брать данные из источника1 , источнику1 передать поля из контрола2,3,4.
Пользователь также может брать готовые композиции например как 1) и 2) и объединить их. Т.е. сделать вариант
3) textbox-datagrid-datagrid, работающих по 1)му и 2му сценарию одновременно.
Еще не совсем ясно как быть с фильтром, т.к. фильтр предполагает вызов callback который возвращает true/false подходит элемент или нет, а как быть при частичной загрузке данных, когда все данные из базы нельзя загрузить их там может быть очень много что не хватит ресурсов, нужно чтобы изменение свойства фильтра каждый раз инициировало запрос к бд и считывало новый блок данных.