2016-06-27 2 views
0

У меня есть следующая проблема в приложении uwp.Увольнение много PropertyChangedEvents в течение одного обработчика нажатия кнопки

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

{"Layout cycle detected. Layout could not complete."} 

Я думаю, что это связано с тем, что для многих событий PropertyChanged допускается множество обновлений пользовательского интерфейса при нажатии одной кнопки. Я попытался обновить свойство без запуска события PropertyChanged, но я не могу заставить его обновлять интерфейс.

+0

Вам нужно будет запустить событие PropertyChanged в какой-то момент, чтобы обновить интерфейс. Подумайте о переходе из 'ObservableCollection' в' List', а затем вручную запустить PopertyChanged только один раз. – Corcus

+0

Не могли бы вы предоставить свой код? Мы не можем отлаживать, гадая. –

ответ

-1

Спасибо за предложения. Теперь я смог решить проблему. Когда я изменяю свойство в коллекции, другое listview становится видимым, которое также привязано к коллекции. Поэтому я догадался, что ui просто нужно некоторое время, чтобы отобразить представление внутреннего списка и рассчитать новый размер внешнего списка. Вот что я сделал:

Timer collapseTimer; 

    internal void collapseAll() 
    { 
     collapseTimer = new Timer(collapseCallBack, null, 0, Timeout.Infinite); 
    } 


    private async void collapseCallBack(object state) 
    { 
     foreach (var item in views) 
     { 
      var asyncAction = CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Low,() => 
     { 
      item.IsCollapsed = true; 
     }); 
      await Task.Delay(10); 
     } 
     collapseTimer.Dispose(); 
    } 

Когда collapsAll() вызывается, фоновый поток начинает которые позволяют это пользовательский интерфейс изменить свойство каждого элемента по одному каждый раз, когда у него есть время, чтобы сделать это.

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