2016-07-30 41 views
0

我正在對TabControl內顯示的UserControl內的數據網格進行排序。在TabControl上選擇新選項卡後,CollectionViewSource不能排序

主窗口包含TabControl,如下所示。

<Grid> 
    <TabControl x:Name="EquipTabs" ItemsSource="{Binding Equipment}" > 
     <TabControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name}" /> 
      </DataTemplate> 
     </TabControl.ItemTemplate> 
     <TabControl.ContentTemplate> 
      <DataTemplate> 
       <ctrls:MachData DataContext="{Binding Path=MachineViewModel}" /> 
      </DataTemplate> 
     </TabControl.ContentTemplate> 
    </TabControl> 
</Grid> 

當第一個選項卡被激活時,用戶控件正確地對datagrid進行排序。但是,當我點擊不同的選項卡或切換回原來的,datagrid不排序。

<UserControl.Resources> 
    <CollectionViewSource x:Key="StatesSource" Source="{Binding States}" > 
     <CollectionViewSource.SortDescriptions> 
      <scm:SortDescription PropertyName="StartTime" Direction="Descending" /> 
     </CollectionViewSource.SortDescriptions> 
    </CollectionViewSource> 
</UserControl.Resources> 

<Grid> 
    <DataGrid x:Name="dgStates" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
       ItemsSource="{Binding Source={StaticResource StatesSource}}"> 
    </DataGrid> 
</Grid> 

的結合顯示下列跟蹤:

Deactivate 
    Replace item at level 0 with {NullDataItem} 
    Activate with root item MachDataViewModel (hash=25379957) 
    At level 0 using cached accessor for MachDataViewModel.States: RuntimePropertyInfo(States) 

爲什麼那種最初只發生?

感謝您的任何幫助。

回答

0

發生這種情況的原因是DataGrid的工作方式。 DataGrid在設置ItemsSource之前清除SortDescriptions

如果我們可以在DataGrid完成ItemsSource後申請我們的SortDescriptions,我們的SortDescriptions將工作。

TargetUpdated事件來救援,但要使用它,我們必須在我們的Binding設置NotifyOnTargetUpdated=True

<DataGrid 
    TargetUpdated="dgStates_TargetUpdated" 
    ItemsSource="{Binding Source={StaticResource StatesSource}, NotifyOnTargetUpdated=True}" /> 

代碼:

private void dgStates_TargetUpdated(object sender, DataTransferEventArgs e) 
{ 
    CollectionViewSource sc = this.Resources["StatesSource"] as CollectionViewSource; 
    sc.SortDescriptions.Add(new System.ComponentModel.SortDescription("Name", System.ComponentModel.ListSortDirection.Ascending)); 
} 
相關問題