Утечка памяти в PagedCollectionView Silverlight 4 - PullRequest
1 голос
/ 24 августа 2010

У меня есть заметная коллекция с некоторыми предметами.

 /// <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, потому что я должен сгруппировать элементы в сетке данных

 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"));

и, с точки зрения, есть сетка данных, которая связывает 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>

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

1 Ответ

1 голос
/ 17 марта 2011

Проблема заключается в представлении постраничной коллекции, подключенном к NotifyPropertyChanged из вашего RaisePropertyChanged (ItemsPropertyName); и никогда не освобождает ловушку события ... Я решил это, потому что мне не нужно группировать, возвращая ICollectionView. Когда вы связываете сетку с ObservableCollection, сетка данных создаст для вас 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");
    }
...