Утечка памяти, если мы устанавливаем свойство ItemSource элемента управления в нуль в WPF? - PullRequest
3 голосов
/ 19 июля 2010

У меня есть TabControl, который имеет два TabItems. Каждый из этих двух TabItems имеет список. В обработчике событий SelectionChanged я устанавливаю для свойства ItemSource соответствующего ListBox значение null и заполняю другой коллекцией. Теперь, когда я продолжаю выбирать каждую вкладку, возникает всплеск памяти. Почему это?

Ответы [ 2 ]

1 голос
/ 19 июля 2010

Старайтесь не очищать списки при смене вкладок, я не думаю, что WPF попытается нарисовать список, если он не отображается.Когда мне нужно, чтобы listbox / itemscontrol отображал коллекцию объектов, я делаю это:

//have all the usual usings and
using System.ComponentModel
using System.Collections.ObjectModel
class Bar : INotifyPropertyChanged
{
   //make your properties setters call PropertyChanged
}
class Bars : ObservableCollection<Bar>
{
}

, затем устанавливаю в вашем списке ItemsSource в качестве экземпляра Bars и использую шаблон данных для отображениякаждый Bar.Это означает, что вам больше никогда не придется устанавливать ItemsSource (потому что ObservableCollection автоматически сообщит списку обновляться, когда что-то изменится), что, как я предполагаю, является причиной утечки.Не повторяя ItemsSource программа будет вероятно более эффективной, но это не гарантия :), если вы впадаете в отчаяние, Red-Gate делает бесплатный .net рефлектор такВы можете взглянуть на то, что на самом деле делает ваш ListBox.

Другая проблема может заключаться в том, что список не виртуализируется должным образом, но я помню, что ListBoxes виртуализируются, но для этого вам понадобится второе мнение.

0 голосов
/ 21 декабря 2012

Даже если это не так, но TabControl - это просто обычный ItemsControl. http://msdn.microsoft.com/en-us/library/system.windows.controls.tabcontrol.aspx

При установке выбранного элемента на вкладку, визуальное дерево полностью создается из содержащего его содержимого.

Если у вас есть «стоп-страница», попробуйте загрузить данные асинхронно в Task Factory.

Также, возможно, очистите вашу Коллекцию вместо того, чтобы установить ее в нуль:)

...