我有一个ListView,我在后面的代码中绑定到CollectionViewSource:
collectionView = CollectionViewSource.GetDefaultView(TableView.ItemsSource);
collectionView.SortDescriptions.Clear();
collectionView.SortDescriptions.Add(new SortDescription(propertyName, direction));
TableView是ListView,propertyName是我想要排序的列的名称,方向是升序或降序。
XAML具有以下ItemSource:
ItemsSource="{Binding Rows}"
后面的代码对于Rows具有以下内容:
List<TableRow> rows;
public List<TableRow> Rows
{
get { return rows; }
set
{
rows = value;
UpdateProperty("Rows");
}
}
更新如下:
public void Update()
{
...generate a list of rows...
Rows = ...rows...
}
调用Update时会出现问题,列表视图会更新,但会丢失之前在CollectionViewSource上的排序集。
答案 0 :(得分:4)
如果您正在“新建”行,则之前行的任何设置都将消失。如果你清除(不是新的)行,那么我认为他们将保留设置。
你甚至不想在更新中使用Rows =行。 然后分配行。
NotifyPropertyChange("Rows");
因此UI知道要更新
如果你要换新的话再重新分配
collectionView = CollectionViewSource.GetDefaultView(TableView.ItemsSource);
collectionView.SortDescriptions.Clear();
collectionView.SortDescriptions.Add(new SortDescription(propertyName, direction));
也许
private List<TableRow> rows = new List<TableRow>();
并且拥有你唯一的新地点
答案 1 :(得分:2)
如果其中一个分组,排序和过滤操作涉及的项属性值是 更新,然后将不再进行排序/分组/过滤。
WPF 4.5引入了一个称为实时整形的功能,可以对其进行整形 现场收集视图。
有关详细信息,请参阅this article。
答案 2 :(得分:1)
答案是在更新后重新应用排序说明,如:
collectionView = CollectionViewSource.GetDefaultView(TableView.ItemsSource);
collectionView.SortDescriptions.Clear();
collectionView.SortDescriptions.Add(new SortDescription(propertyName, direction));
然后排序不会丢失。在集合视图上刷新并没有帮助。
答案 3 :(得分:0)
您在更新后尝试CollectionView.Refresh()
了吗?
如果这没有用,那么我认为您的问题就出现了,因为您通过为CollectionView
列表分配新值来更改Rows
的来源。
我不知道您的代码是否可行,但是不分配新列表只是清除您之前的代码并在那里插入新行。
if (Rows != null)
Rows.Clear();
Rows.TrimExcess();
else
Rows = new List<TableRow>();