14

ItemsControlをCollectionViewSourceにバインドしています。コードは次のとおりです。

this.Trucks = new ObservableCollection<Truck>();
            foreach (var truck in DataRepository.Trucks.Where(t => t.ReadyDate.Date.Equals(this.Date)))
            {
                this.Trucks.Add(truck);
            }

            this.TrucksSource = new CollectionViewSource { Source = this.Trucks };
            this.TrucksSource.SortDescriptions.Add(new SortDescription("ReadyAddress.Region.RegionNumber", ListSortDirection.Ascending));
            this.TrucksSource.SortDescriptions.Add(new SortDescription("TruckId", ListSortDirection.Ascending));

私が最初にバインドしたとき-ソートは機能します。ObservableCollectionにアイテムを追加すると、適切な場所に挿入されます。しかし、並べ替えるプロパティを変更すると、このアイテムはリスト内で「シフト」されません。

ReadyAddress.Region.RegionNumberINotifyPropertyChangedを適切に発生させ、バインドされたフィールドに表示されますが、順序は変更されません。起こってはならないことがあると思いますか、それともこれを処理するためのより良い方法がありますか?

4

3 に答える 3

11

遅い答えですが、4.5ではListCollectionView(ListBoxとCollectionViewSource.Viewのデフォルトの実装)で、これを可能にするために新しいプロパティが追加されました。

IsListSortingおよびListSortingPropertiesを使用して、自動再ソートを有効にすることができます。いいえ、ビューは再構築されません

list.SortDescriptions.Add(new SortDescription("MyProperty", ListSortDirection.Ascending));
list.IsLiveSorting = true;
list.LiveSortingProperties.Add("MyProperty");

これは、プロパティが変更されたときに頼る必要がありMyPropertyます。

于 2018-11-08T21:00:54.333 に答える
5

collectionviewsourceを更新してみましたか?

    this.TruckSource.View.Refresh();
于 2012-06-30T03:15:49.910 に答える
5

私が見つけたすべての答えは言及されましView.Refresh()たが、それは大きなリストにはあまり良い解決策ではありません。私がやったのはRemove()Add()このアイテムです。次に、リスト全体をリロードせずに適切に再配置されました。

注意の言葉!私の仕事ではうまくいきますが、あなたの場合、オブジェクトを削除して再度追加すると、コードの記述方法によっては副作用が発生する可能性があります。私の場合、これはUI効果のあるリストであり、新しいアイテムはトランジションとともに表示されるため、更新するとリスト全体にトランジションが表示され、削除/追加するとアイテムの再配置方法がわかりやすく表示されます。

于 2012-07-04T00:42:40.447 に答える