3

コードビハインドで CollectionViewSource にバインドしている ListView があります。

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

4 に答える 4

4

行を「新しい」場合は、前の行の設定はすべて失われます。行をクリア(新規ではない)すると、設定が保持されると思います。

また、行=更新中の行も必要ありません。次に行を割り当てた後。

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

そしてそれをあなたがそれを新しくする唯一の場所にします

于 2012-04-11T16:12:25.637 に答える
2

答えは、次のように、更新後にソートの説明を再適用することです。

collectionView = CollectionViewSource.GetDefaultView(TableView.ItemsSource);  
collectionView.SortDescriptions.Clear();
collectionView.SortDescriptions.Add(new SortDescription(propertyName, direction));

その後、並べ替えは失われません。コレクション ビューを更新しても役に立ちません。

于 2012-04-12T10:43:10.357 に答える
2

グループ化、並べ替え、およびフィルター操作のいずれかに関連する項目のプロパティ値が更新された場合、並べ替え、グループ化、フィルター操作は再度実行されません。

WPF 4.5 では、コレクション ビューをライブで整形するライブ シェーピングと呼ばれる機能が導入されています。

詳細については、この記事を参照してください。

于 2013-01-14T11:23:58.063 に答える
0

CollectionView.Refresh()更新後にやろうとしましたか?

これで問題が解決しない場合は、リストCollectionViewに新しい値を割り当ててソースを変更したために問題が発生したと思いますRows

あなたのコードで可能かどうかはわかりませんが、新しいリストを割り当てないでください。以前のリストをクリアして、そこに新しい行を挿入してください。

if (Rows != null)
   Rows.Clear();
   Rows.TrimExcess();
else
   Rows = new List<TableRow>();
于 2012-04-12T09:08:44.837 に答える