У меня есть метод, который запрашивает базу данных с использованием структуры сущностей и помещает результаты в ICollectionView
. ICollectionView
действует как ItemsSource
для DataGrid
. Все работает нормально в первом запросе, но после второго запроса данные сортируются неправильно, несмотря на применение правильного SortDescriptions
.ICollectionView Sort не работает после смены источника
Вот мой код пытается запрашивание и группировка/сортировка данных:
CollectionViewSource cvsRS;
private ObservableCollection<productorder> rs;
public ObservableCollection<productorder> RS
{
get { return rs; }
set
{
if (rs != value)
{
rs = value;
OnPropertyChanged("RS");
}
}
}
private ICollectionView rsView;
public ICollectionView RSView
{
get { return rsView; }
set
{
if (rsView != value)
{
rsView = value;
OnPropertyChanged("RSView");
}
}
}
public void QueryDatabase()
{
RS = new ObservableCollection<productorder>(DatabaseEntities.productorders.Where(o => o.month.id == CurrentMonth.id));
if (RS != null)
{
cvsRS.Source = RS;
RSView = cvsRS.View;
RSView.GroupDescriptions.Clear();
RSView.GroupDescriptions.Add(new PropertyGroupDescription("producttype.productcategory.name"));
RSView.GroupDescriptions.Add(new PropertyGroupDescription("producttype.name"));
RSView.SortDescriptions.Clear();
RSView.SortDescriptions.Add(new SortDescription("producttype.productcategory.sortorder", ListSortDirection.Ascending));
RSView.SortDescriptions.Add(new SortDescription("client.name", ListSortDirection.Ascending));
RSView.Refresh();
CurrentRecord = null;
SelectedRecords = null;
}
}
Группировка работает отлично, но группы не в правильном порядке, основанном на сортировке. Я пробовал ряд возможных «исправлений» без каких-либо успехов (например, добавляя описания сортировки/группы непосредственно к CollectionViewSource
, сортируя перед группировкой, удаляя часть сортировки/группировки, удаляя SortDescriptions
за CollectionViewSource does not re-sort on property change).
Кто-нибудь знает, как поддерживать порядок сортировки независимо от того, сколько запросов выполняется? Я открыт для альтернативных методов запроса отображения данных в DataGrid
, если это может сработать.
Я попытался привязать источник (не назначать, связывать, используя экземпляр класса «Binding») один раз, в свойство «ObservableCollection», которое вызывает «PropertyChanged», когда вы даете ему новую коллекцию. Затем заселите, изменив свойство. Либо бросьте в новую коллекцию, либо очистите и заселите старый. Но никогда не прикасайтесь к 'cvsRS.Source', за исключением того, чтобы сначала настроить Binding. –
Надеюсь, я правильно это интерпретировал, я сделал это в своем конструкторе: 'cvsRS = new CollectionViewSource(); cvsRS.Source = новое привязка («RS»); RSView = cvsRS.View; ' Но я получаю сообщение об ошибке:« System.Windows.Data.Binding »не является допустимым значением для свойства« Источник ». –
Я быстро взвесил тест, и он работал так, как я ожидал, поэтому я опубликовал ответ с примером того, как сделать привязку. Вставка этого комментария в любом случае будет нечитабельной. –