Загруженное событие ListView не запускается при использовании в Task Factory С#

У меня есть список, привязанный к свойству. Также есть событие загрузки "ListLoaded".

<ListView ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Hidden" BorderThickness="0" HorizontalAlignment="Left" ItemsSource="{Binding DoctorDetailsBooking,Mode=TwoWay}">
    <i:Interaction.Triggers>
         <i:EventTrigger EventName="Loaded">
             <cmd:EventToCommand Command="{Binding ListLoaded}" PassEventArgsToCommand="True" />
          </i:EventTrigger>
    </i:Interaction.Triggers>

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

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

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, событие запускается, и все работает хорошо.

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


person Ani_1317    schedule 04.02.2015    source источник
comment
Вероятно, элемент управления загружается до того, как команда ListLoaded будет установлена ​​внутри задачи, поэтому я предлагаю вам переместить назначение ListLoaded перед задачей.   -  person Grx70    schedule 04.02.2015
comment
Но ListLoaded использует некоторые свойства, которые устанавливаются в методе FilleSlots(). Поэтому, когда я переместил задание над задачей, оно не загрузилось должным образом. Точно так же, когда я переместил назначение после задачи, сначала загружается список, а затем запускаются методы (так как они находятся внутри задачи).   -  person Ani_1317    schedule 04.02.2015


Ответы (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());

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

person Grx70    schedule 04.02.2015
comment
Я разместил еще одно сомнение в приведенной ниже ссылке. Не могли бы вы помочь, если у вас есть время? stackoverflow.com/questions/28320641/ - person Ani_1317; 04.02.2015