2016-07-30 8 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> 

ユーザコントロールは、最初のタブがアクティブになったときに、データグリッドを正しくソートします。しかし、別のタブをクリックするか、元のタブに戻ると、データグリッドはソートされません。

<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のために起こります。 DataGridItemsSourceに設定する前にSortDescriptionsをクリアします。

DataGridItemsSourceで終了した後にSortDescriptionsを適用できる場合は、SortDescriptionsが動作します。

TargetUpdatedイベントは救助になりますが、それを使用するにはNotifyOnTargetUpdated=TrueBindingに設定する必要があります。

<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)); 
} 
関連する問題