问题
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>();
来源:https://stackoverflow.com/questions/10109518/my-collectionviewsource-is-not-picking-up-changes