我的CollectionViewSource没有获取更改

时间:2012-04-11 15:53:38

标签: c# wpf collectionviewsource

我有一个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上的排序集。

4 个答案:

答案 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>();