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.
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
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.
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.
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>();