Как убедиться, что все свойства загружены в шаблон Silverlight ViewModel (контроль параллелизма?) - PullRequest
0 голосов
/ 24 мая 2011

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

Базовая модель представления разработана для того, чтобы помочь отобразить список объектов группы и связанных с ними событий вне всех доступных событий .В базовой модели данных у меня есть следующие объекты (EF) и соответствующие им отношения:

Group -> GroupEvent <- Event

Модель представления имеет две наблюдаемые коллекции - одну для событий и одну для групп.Коллекция событий представляет все события, доступные для любой группы.Все события загружаются только один раз из службы RIA WCF, и по прибытии данные каждого объекта события копируются в локальный объект, который помещается в коллекцию событий.

В дополнение к свойствам сущности Event объект LocalEvent также определяет логическое свойство IsSelected, которое по умолчанию инициализируется как «false».Это свойство используется в CheckBoxGridColumn с двухсторонней привязкой, поэтому я могу установить состояние флажка как отмеченное или не отмеченное.

Коллекция групп в ViewModel инициализируется аналогичным образом.Я создал объект LocalGroup, который имеет коллекцию LocalGroupEvents.В конструкторе после загрузки событий я загружаю все объекты группы (и связанные с ними события GroupEvents) из службы RIA WCF.Я копирую все свойства каждого объекта Group в объект LocalGroup, устанавливаю его коллекцию LocalGroupEvents и, наконец, помещаю LocalGroup в наблюдаемую коллекцию Groups из ModelView.

Наконец, две коллекции привязываются к своим соответствующим сеткам.Сетка групп отображает только имя группы, а сетка «События» - флажок рядом с каждым событием.Сетка групп имеет обработчик события SelectedItemChanged, и всякий раз, когда это происходит, я беру объект LocalGroup, считываю все его LocalGroupEvents и устанавливаю для свойства «IsSelected» в сетке «События» значение true для каждого события, идентификатор которого соответствует Eventid в LocalGroupEvents.

Ну, этот рабочий процесс работает нормально.100% времени.У меня проблема в том, что, если данные для событий поступают после данных для групп?Я имею в виду, что, поскольку любой вызов службы RIA является асинхронным, потоки не останавливаются, чтобы гарантировать, что данные поступят в правильном порядке.

Что делать, если существует только одна группа, и она загружается очень быстро до событийбыл шанс загрузить?В этом случае, даже если пользователь нажимает на группу, он ничего не увидит и не сможет редактировать выбранную группу.

Как убедиться, что данные поступили в правильном порядке до того, какПользовательский интерфейс привязывается к представлению модели?

Спасибо,

Bleepzter

1 Ответ

1 голос
/ 24 мая 2011

Вы можете использовать IResult и сопрограммы от Caliburn Micro. Это позволит вам заполнить эти асинхронные объекты в определенном порядке.

IResult пример, документы здесь .

 public IEnumerable<IResult> GoForward()
    {
        yield return Loader.Show("Downloading...");
        yield return new LoadCatalog("Caliburn.Micro.Coroutines.External.xap");
        yield return Loader.Hide();
        yield return new ShowScreen("ExternalScreen");
    }

Вы можете загрузить LoadData.cs из здесь . Это в Samples / GameLibrary / GameLibrary / Framework / Results. Это результат, который кто-то написал, который добавляет метод расширения к DataContext.

...