2010-08-24 3 views
1

У меня есть наблюдаемая коллекция с некоторыми элементами.PagedCollectionView утечка памяти Silverlight 4

/// <summary> 
    /// The <see cref="Items" /> property's name. 
    /// </summary> 
    public const string ItemsPropertyName = "Items"; 

    private ObservableCollection<SomeItem> _items = new ObservableCollection<BrandItem>(); 

    /// <summary> 
    /// Gets the Items property. 
    /// </summary> 
    public ObservableCollection<SomeItem> Items 
    { 
     get 
     { 

      return _items; 
     } 

     set 
     { 
      if (_items == value) 
      { 
       return; 
      } 

      _items = value; 

      // Update bindings, no broadcast 
      RaisePropertyChanged(ItemsPropertyName); 
     } 
    } 

, а также pagedCollectionView потому что я должен сгруппировать элементы в DataGrid

public const string ItemGroupedPropertyName = "ItemGrouped"; 

    private PagedCollectionView _itemsGrouped; 

    /// <summary> 
    /// Gets the ItemSpecificationsGrouped property. 
    /// </summary> 
    public PagedCollectionView ItemSpecificationsGrouped 
    { 
     get { return _itemsGrouped; } 

     set 
     { 
      if (_itemsGrouped == value) 
      { 
       return; 
      } 

      _itemsGrouped = value; 

      // Update bindings, no broadcast 
      RaisePropertyChanged(ItemGroupedPropertyName); 
     } 
    } 
    #endregion 

в ViewModel конструктору Я установил

ItemGrouped = new PagedCollectionView(Items); 
ItemGrouped.GroupDescriptions.Add(new PropertyGroupDescription("GroupName")); 

и вид на есть DataGrid, которые связываются ItemsGrouped

<data:DataGrid ItemsSource="{Binding ItemsGrouped}" AutoGenerateColumns="False"> 
            <data:DataGrid.Columns > 
             <data:DataGridTextColumn IsReadOnly="True" 
              Binding="{Binding ItemAttribut1}" Width="*"/> 
             <data:DataGridTextColumn IsReadOnly="True" 
              Binding="{Binding Attribute2}" Width="*" /> 
            </data:DataGrid.Columns> 

          </data:DataGrid> 

, когда я меняю элементы в элементах (очищаю и добавляю новые) после многих раз у меня происходит утечка памяти. Когда я удаляю ItemsSource, все в порядке. Поэтому я знаю, что PagedCollectionView вызывает утечку памяти, но я не знаю почему. Любая идея, пожалуйста? Или другое решение для групповых элементов внутри datagrid некоторым свойством в коллекции .. Спасибо!

+0

Вы должны очистить существующие коллекции и снова добавить элементы в коллекции, а не использовать новые коллекции каждый раз. – Jehof

ответ

1

Проблема заключается в просмотре коллекции подкачки, связанного с NotifyPropertyChanged из вашего RaisePropertyChanged (ItemsPropertyName); и никогда не выпускает событие ... Я решил это, потому что мне не нужна группировка, возвращая ICollectionView. Когда вы привязываете сетку к ObservableCollection, datagrid создаст для вас PagedCollectionView. Когда вы привязываетесь к ICollectionView, сетка будет использовать ICollectionView без создания PagedCollectionView. Надеюсь, это поможет ...

public ICollectionView UserAdjustments 
    { 
     get { return _userAdjustmentsViewSource.View; } 
    } 

    private void SetCollection(List<UserAdjustment> adjustments) 
    { 
     if(_userAdjustmentsViewSource == null) 
     { 
      _userAdjustmentsViewSource = new CollectionViewSource(); 
     } 
     _userAdjustmentsViewSource.Source = adjustments; 
     RaisePropertyChanged("UserAdjustments"); 
    } 
Смежные вопросы