2015-10-01 3 views
0

У меня есть datagrid в приложении WPF, который их itemssource ограничен наблюдаемым цветом в ViewModel.Как переупорядочить мою наблюдаемую коллекцию при сортировке datagrid

<DataGrid 
        RenderOptions.ClearTypeHint="Enabled" 
        TextOptions.TextFormattingMode="Display" 
        SelectionUnit="FullRow" 
        IsSynchronizedWithCurrentItem="True" 
        IsReadOnly="True" 
        SelectionMode="Single" 
        MinWidth="300" ColumnWidth="*" 
        SelectionChanged="DataGrid_SelectionChanged" 
        ItemsSource="{Binding AdminEntity, NotifyOnTargetUpdated=True,IsAsync=True, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" 
        SelectedIndex="{Binding selectedIndex}" 
        AutoGenerateColumns="False" Grid.Column="0" Grid.RowSpan="2"> 

        <DataGrid.Columns> 
         <DataGridTextColumn Header="Nom et prénom" MinWidth="100" Binding="{Binding ADM_NOM_PRENOM}" SortMemberPath ="{Binding ADM_NOM_PRENOM}"></DataGridTextColumn> 
         <DataGridTextColumn Header="Mail" MinWidth="100" Binding="{Binding ADM_MAIL}"></DataGridTextColumn> 
         <DataGridTextColumn Header="Session" MinWidth="100" Binding="{Binding ADM_SESS}"></DataGridTextColumn> 

        </DataGrid.Columns> 

       </DataGrid> 

private ObservableCollection<DB_ADMINISTRATEUR> _admins; 
     public ObservableCollection<DB_ADMINISTRATEUR> AdminEntity 
     { 
      get { return _admins; } 
      set { _admins = value; OnPropertyChanged("AdminEntity"); } 
     } 

Это работает отлично, но когда я отсортирован мой DataGrid ObservableCollection не обновляется и не заказана. Любая помощь? Спасибо.

+3

Каждый элемент WPF, который отображает коллекции, создает ICollectionView и привязывается к нему. Это промежуточный объект, который не отражает сортировку/фильтрацию в базовую коллекцию. [This] (https://social.msdn.microsoft.com/Forums/vstudio/en-US/0075ec8b-71d8-43e8-af08-818c09548d41/sorting-an-ef-collection-in-datagrid) поток может помочь вам в дальнейшем – Domysee

ответ

1

Я думаю, вы сортировка этого пути или что-то похоже:

AdminEntity = new ObservableCollection<DB_ADMINISTRATEUR>(AdminEntity.OrderBy(a=>a.Name)); 

Когда вы пишете = new ObservableCollection<...> вы разорвать ваши привязки. Всякий раз, когда вы связываете коллекции есть слой, созданный между вашим контролем и сбора, которые могут быть доступны так:

ListCollectionView _adminEntityView = CollectionViewSource.GetDefaultView(AdminEntity) 
             as ListCollectionView; 

Затем вы можете применить сортировку к этому слою. Это не изменит вашу коллекцию, это будет просто изменить способ его отображения

Есть 2 способа сортировки:

1) Немного медленно и легко

_adminEntityView .SortDescriptions.Add( 
       new SortDescription("Name", ListSortDirection.Ascending); 

2) Быстрая

_adminEntityView .CustomSort = new AdminSorter(); 

public class AdminSorter: IComparer 
{ 
    public int Compare(object x, object y) 
    { 
     DB_ADMINISTRATEUR X = x as DB_ADMINISTRATEUR; 
     DB_ADMINISTRATEUR Y = y as DB_ADMINISTRATEUR; 
     return X.Name.CompareTo(Y.Name); 
    } 
} 
Смежные вопросы