我使用(玩家)綁定到CollectionViewSource一個DataGrid本身結合到列表框的當前選擇的項目(水平),其中包含每個項集合進行排序/在DataGrid中顯示:CollectionViewSource排序僅在第一次它被綁定到一個源
<ListBox Name="lstLevel"
DisplayMemberPath="Name"
IsSynchronizedWithCurrentItem="True" />
...
<!-- DataGrid source, as a CollectionViewSource to allow for sorting and/or filtering -->
<CollectionViewSource x:Key="Players"
Source="{Binding ElementName=lstLevel,
Path=SelectedItem.Players}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Name" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
...
<DataGrid Name="lstPlayers" AutoGenerateColumns="False"
CanUserSortColumns="False"
ItemsSource="{Binding Source={StaticResource Players}}">
<DataGrid.Columns>
<DataGridTextColumn Header="Name"
Binding="{Binding Path=Name, Mode=TwoWay}"
Width="*" />
<DataGridTextColumn Header="Age"
Binding="{Binding Path=Age, Mode=TwoWay}"
Width="80">
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
(整個C#代碼here,XAML代碼here,整個測試項目here - 除了DataGrid中我添加了一個簡單的列表框的球員,以確保它不是一個DataGrid問題)
問題是玩家在第一次被顯示時被排序,但是一旦我從ListBox中選擇另一個級別,他們就不會被排序了。此外,在第一次顯示玩家時修改姓名會根據變化對他們進行排序,但一旦水平發生變化就不會再進行排序。
所以它看起來像改變CollectionViewSource的源不知何故打破排序功能,但我不知道爲什麼,也不知道如何解決它。有誰知道我做錯了什麼?
(我做了過濾器的測試,但一個一直工作如預期)
框架是.NET 4
我以前經歷過同樣的事情 - 而不是每次創建一個新的對象,你可以刪除並重新插入其內容? – Dave 2010-08-31 15:30:18
除了額外的工作之外,通過創建/釋放對象會不必要地對託管堆進行碎片化,如果可以的話,我寧願避免它。 – RedGlyph 2010-08-31 18:58:28