2015-02-04 2 views
0

У меня есть список, привязанный к свойству. Также есть событие загрузки «ListLoaded».Событие, загруженное ListView, не срабатывает при использовании в Task Factory C#

В своем событии загрузки я устанавливаю 1-й выбранный элемент в true и меняя цвет фона этого элемента.

Некоторые операции и вызовы API выполняются в конструкторе ViewModel. Событие загрузки также устанавливается в конструкторе. Для загрузки экрана требуется некоторое время. Поэтому я добавил весь код в конструктор в Factory Task и соответствующим образом установил видимость индикатора выполнения.

Task tskOpen = Task.Factory.StartNew(() => 
      { 
       ProgressBarVisibility = Visibility.Visible; 

       DataAccess data = new DataAccess(); 
       DoctorDetailsBooking = data.GetDoctorsList(Convert.ToDateTime(BookingDate).Date); 
       FillSlots(); 
       **ListLoaded = new RelayCommand<RoutedEventArgs>(ListViewLoaded);** 

      }).ContinueWith(t => 
       { 
        ProgressBarVisibility = Visibility.Hidden; 
       }, TaskScheduler.FromCurrentSynchronizationContext());  

Вопрос в том, когда я даю код внутри задачи, событие ListeViewLoaded не срабатывает. Следовательно, представление списка неправильно загружено. Если я удалю часть задачи Task, это событие будет запущено, и все будет хорошо.

Я не знаю, как нарезать резьбу и концепцию задачи хорошо. Я что-то упустил?

+1

Возможно, элемент управления загружен до того, как команда «ListLoaded» установлена ​​внутри задачи, поэтому я предлагаю вам переместить назначение «ListLoaded» перед задачей. – Grx70

+0

Но ListLoaded использует некоторые свойства, которые устанавливаются в методе FilleSlots(). Поэтому, когда я переместил назначение над задачей, оно не загрузилось должным образом. Аналогично, когда я переместил назначение после задачи, сначала загружается список, а затем запускаются методы (поскольку они находятся внутри задачи). –

ответ

1

Если вы правильно поняли, что сталкиваетесь с обработкой событий с задержкой - это обработка событий не сразу, а после выполнения какого-либо условия. То, что я хотел бы сделать, - хранить аргументы сгенерированных событий в коллекции, а затем вызывать обработчики после выполнения условия. В вашем случае это будет нечто похожее на это:

//create a queue to store event args 
var deferredEventArgs = new Queue<RoutedEventArgs>(); 
//temporarily assign a handler/command that will store the args in the queue 
ListLoaded = new RelayCommand<RoutedEventArgs>(e => deferredEventArgs.Enqueue(e)); 

Task tskOpen = Task.Factory.StartNew(() => 
{ 
    ProgressBarVisibility = Visibility.Visible; 
    DataAccess data = new DataAccess(); 
    DoctorDetailsBooking = data.GetDoctorsList(Convert.ToDateTime(BookingDate).Date); 
    FillSlots(); 

    //assign the proper handler/command once its ready 
    ListLoaded = new RelayCommand<RoutedEventArgs>(ListViewLoaded); 

}).ContinueWith(t => 
{ 
    //"flush" the queue - handle previous events 
    //decide whether it should be done on the UI thread 
    while(deferredEventArgs.Any()) 
     ListViewLoaded(deferredEventArgs.Dequeue()); 
    ProgressBarVisibility = Visibility.Hidden; 
}, TaskScheduler.FromCurrentSynchronizationContext()); 

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

+0

Это сработало !!! Спасибо, лут @ Grx70 ... Очень ценю помощь ур .. –

+0

Я опубликовал еще одно сомнение в приведенной ниже ссылке. Не могли бы вы помочь, если у вас есть время? http://stackoverflow.com/questions/28320641/task-in-click-event-does-not-handle-ui-related-changes-wpf –

 Смежные вопросы

  • Нет связанных вопросов^_^