My CollectionViewSource is not picking up changes

2019-04-13 07:33发布

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.

4条回答
姐就是有狂的资本
2楼-- · 2019-04-13 08:15

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>();
查看更多
Viruses.
3楼-- · 2019-04-13 08:23

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

查看更多
We Are One
4楼-- · 2019-04-13 08:24

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.

查看更多
虎瘦雄心在
5楼-- · 2019-04-13 08:30

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.

查看更多
登录 后发表回答