#silverlight #data-binding #asynchronous #design-patterns #hierarchical-data
#silverlight #привязка данных #асинхронный #шаблоны проектирования #иерархические данные
Вопрос:
Контекст Silverlight / WPF, C #, .NET 4,
У меня есть 4-уровневое глубокое дерево эскизов, которое мне нужно перечислить и отобразить каким-либо значимым образом. Для синхронного выполнения (последовательный мир) мы могли бы подумать следующим образом:
Channels = Channels_Build("CHANNELS.XML");
foreach Ch in Channels
{
Cats = Cats_Build( Ch.URL ) ;
foreach Cat in Cats
{
PLs = PLs_Build( Cat.URL ) ;
foreach PL in PLs
{
Medias = Medias_Build( PL.URL ) ;
foreach Media in Medias
display Media image
}
}
}
.
Однако у меня есть модель асинхронной загрузки для XML, изображений, …, поэтому я думаю о чем-то вроде этого:
Channels_Build("CHANNELS.XML");
Channels_Loaded()
{ // Channels build from some returned XML
foreach Ch in Channels
Cats_Build( Ch.URL, ??? ) ; //async calls
}
Cats_Loaded()
{ // Cats build from some returned XML
foreach Cat in Cats
PLs_Build( Cat.URL ... ) ;
}
PLs_Loaded()
{ // PLs build from some returned XML
foreach PL in PLs
MediaList_Build( PL.URL ... ) ;
}
MediaList_Loaded()
{ // MediaList build from some returned XML
foreach media in MediaList
display Media image
}
Каждый из Channels_Build, Cats_Build, PLs_Build, MediaList_Build выполняет асинхронный вызов и, следовательно, имеет связанный обратный вызов xxx_Loaded()
Каждый канал имеет 1 или более категорий. Каждая категория содержит 1 или более списков воспроизведения. Каждый плейлист содержит 1 или более носителей, таким образом, у меня есть иерархическая структура глубиной в 4 уровня
Можно предположить, что Channels, Cats, PLS и MediaList имеют общий базовый класс.
Должен ли я объединить эту логику 4x в единый метод рекурсивной сборки? Как? Мне пришлось бы заставить процесс сборки передавать некоторую информацию (родительский узел) соответствующему обратному вызову (я посмотрел IAsyncResult.AsyncState)
Мой мозг заблокирован, и я не могу придумать, что здесь нужно? рекурсия?, передача информации в асинхронные вызовы, конкретный шаблон?, …
Должен ли я сначала собрать данные дерева в памяти в одну структуру? или это было бы полезно, только если я решу использовать элемент управления TreeView? Что, если я решу отобразить информацию, используя повторяющийся шаблон, например, в listbox. Шаблон отображал бы:
Channel-Image Name
Category-Image Name
PlayList-Image Name
MediaList images...
Да, нелистовые узлы будут визуально повторяться в конце списка. Это нормально, поскольку это может предоставить карту, которую я ищу.
Итак, остается загадочный вопрос: как мне перечислить и отобразить все узлы в этой асинхронной модели?
Спасибо.
Ответ №1:
Я бы посмотрел на асинхронное обновление CTP, которое значительно упрощает этот материал