-->

My CollectionViewSource is not picking up changes

2019-04-13 08:10发布

问题:

I have a ListView which I'm binding to a CollectionViewSource in code behind with:

collectionView = CollectionViewSource.GetDefaultView(TableView.ItemsSource);
collectionView.SortDescriptions.Clear();
collectionView.SortDescriptions.Add(new SortDescription(propertyName, direction));

The TableView is the ListView, the propertyName is the name of the column I want sorted, and direction is either ascending or descending.

The XAML has the following for ItemSource:

ItemsSource="{Binding Rows}"

The code behind has the following for the Rows:

List<TableRow> rows;

public List<TableRow> Rows
{
    get { return rows; }
    set 
    {
        rows = value;
        UpdateProperty("Rows");
    }
}

the update is as follows:

public void Update()
{
     ...generate a list of rows...

     Rows = ...rows...
}

The problem occurs when the Update is called, the list view does update, but loses the sorting set previously on the CollectionViewSource.

回答1:

If you are "newing" rows then any setting on the prior rows is gone. If you clear (not new) the rows then I think they will hold the setting.

And you don't even want Rows = rows in update. After assign rows then.

NotifyPropertyChange("Rows"); 

So the UI know to update

If you are going to new then reassign

collectionView = CollectionViewSource.GetDefaultView(TableView.ItemsSource);
collectionView.SortDescriptions.Clear();
collectionView.SortDescriptions.Add(new SortDescription(propertyName, direction));

Maybe

private List<TableRow> rows = new List<TableRow>();  

and have that the only place you new it



回答2:

If an item property value involved in one of the grouping, sorting and filtering operations is updated, then the sorting/grouping/filtering will not be done again.

WPF 4.5 introduce a feature called live shaping which shapes the collection view in live.

See this article for more info.



回答3:

The answer is to reapply the sort descriptions after the update, as in:

collectionView = CollectionViewSource.GetDefaultView(TableView.ItemsSource);  
collectionView.SortDescriptions.Clear();
collectionView.SortDescriptions.Add(new SortDescription(propertyName, direction));

Then the sorting isn't lost. Refresh on the collection view doesn't help.



回答4:

Did you try to do CollectionView.Refresh() after your update?

If this does not help then I think your problem occurs because you change the source of your CollectionView by assigning new value to your Rows list.

I don't know if it is possible to your code but don't assign new list just clear your previous one and insert new rows there.

if (Rows != null)
   Rows.Clear();
   Rows.TrimExcess();
else
   Rows = new List<TableRow>();