2015-11-03 27 views
3

後,不工作,我決定寫一個小的測試應用,解決方案下載是在這裏:的ListCollectionView的現場整形錯誤

here

以下是對問題的描述:我使用Person對象的ObservableCollection,以及Age和Name屬性(使用NPC)。我創建綁定到DataGrid具有自定義GroupStyle暴露的擴展

對於這個觀點我設置爲ListCollectionView:

  • GroupDescription到年齡
  • SortDescription到年齡(對組進行排序)
  • SortDescription爲名稱

啓動後,DispatcherTimer將每個人的所有年齡重新計算爲30到45之間的隨機值。

在運行時故障:對於組中所有動態度假村中的約60-70%,排序順序是正確的。例如31歲之前的34歲之前,41歲之前的41歲。但是有時候第30個數字是在第40個數字之間,這是錯誤的。問題在哪裏,我該如何解決?順便說一下,這個問題只適用於組排序。

順便說一句:爲了什麼目的是LiveSortingProperties集合,設置一個SortDescription和IsLiveSorting = True顯然會激活生活整形,在這種情況下,我應該添加一個字符串到這個集合?

這是錯誤的組分類的截圖:

Example Picture of wrong sorting

enter image description here

+0

我在Microsoft connect上添加了一個錯誤條目。也許你可能會投票:https://connect.microsoft.com/VisualStudio/feedback/details/2017716/wpf-live-shaping-groups-are-not-sorted-correctly-after-a-property-changes – jbe

+0

謝謝,jbe。你也遇到過這個問題嗎? – Michael

回答

0
Random rnd = new Random(); 
DispatcherTimer timer = new DispatcherTimer(); 
timer.Interval = TimeSpan.FromMilliseconds(4000); 
timer.Tick += (sender, args) => 
{ 
     foreach (var person in Persons) 
     { 
      person.Age = rnd.Next(30, 45); 
     } 
     PersonsView.Refresh(); 
    }; 
    timer.IsEnabled = true; 

View.Refresh的伎倆,我

+0

好吧,這似乎是一個解決方案,但不是很令人滿意,因爲'生活塑造'應該是現成的。在我的特殊情況下(改變一個負責該組的創建和排序的屬性),我沒有參考視圖本身。我可以使用一些事件,但對我來說這並不乾淨。無論如何,這個「bug」的描述是什麼? – Michael

+0

爲什麼你沒有參考你的IcollectionView?它在你的viewmodel中,所以你有這個參考肯定,你可以調用.Refresh當你需要 – blindmeis

+0

時,因爲在我的例子中,修改排序屬性的代碼是在像視圖本身一樣的位置,這只是爲了示範。最初,這種改變將來自另一個大會,只是設定了價值,但不知道視圖。國際海事組織,它應該工作,它顯然是一個框架錯誤 – Michael

1

組的順序呈現發現。在您的情況下,數據按年齡(然後按名稱)排序,因此數據的初始掃描將在Age-34組之前發現Age-31組。然而,如果沒有一個人的年齡是37歲,那麼就沒有37歲的年齡組。稍後,如果在Age = 37時添加新人員(或更改現有人員的年齡,啓用實時分組時),則會創建一個新的年齡-37組。但是由於它是在最初的羣體之後被發現的,所以在所有這些羣體之後都會被添加。

目前(4.6.1)無法爲組自身聲明排序順序。正如很多人所要求的那樣,我們正在考慮添加此功能。

順便說一句:LiveSortingProperties的目的是當你想按屬性A,B和C排序,但你知道只有屬性C會改變的情況。在SortDescriptions中聲明所有三個屬性,但在LiveSortingProperties中僅聲明C.這樣我們就不會浪費精力爲A和B設置不會被調用的更改監聽器。

1

我最近遇到了這個問題。因爲我的客戶可能不會立即升級到4.6.2,所以我創建了一個解決方案。

我的應用程序使用ReactiveUI(http://reactiveui.net/),它有利於此解決方案。將我的解決方案適配到Person示例,基本上我監視Age屬性的任何更改,然後計算組的數量(即年齡),並且只有當年齡組數量發生變化時(DistinctUntilChanged),才能重新配置分組和排序。

因爲這使用了反應模式,所以它非常高效,但在我的情況下,在任何時候只有幾十個元素。

// NB People is a ReactiveList<Person> 

void SetupInterface() 
{ 
    People.ItemChanged.Select(p => p.PropertyName == "Age") 
     .Where(ageChanged => ageChanged) 
     .DistinctUntilChanged(_ => People.GroupBy(x => x.Age).Count()) 
     .Subscribe(_ => 
     { 
      ConfigureGrouping(); 
     }); 
    ConfigureGrouping(); 
} 

void ConfigureGrouping() 
{ 
    using (_collectionView.DeferRefresh()) 
    { 
     // code to reset and rebuild the group and sort descriptions... 
    } 
}