Можете ли вы помочь мне настроить сортировку в silverlight, используя PagedCollectionview, сопоставленную с наблюдаемым цветом. Это код, который отлично работает для части сортировки, но не обновляет сетку, поскольку сортировка из первого столбца не очищаетсяПользовательская сортировка в PagedCollectionview & Silverlight
Например. если я сортирую его с помощью «описания», он работает как в направлении (asc desc). но после сортировки коллекции с использованием «описания», если я нажму на «Заголовок типа», он должен удалить сортировку более раннего вида &, используя «Тип «Только колонка.
private void SortCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Remove || e.Action == NotifyCollectionChangedAction.Reset)
return;
if (e.Action == NotifyCollectionChangedAction.Replace || e.Action == NotifyCollectionChangedAction.Add)
{
MyPVC.SortDescriptions.Clear();
if (e.NewItems.Count > 0)
{
MyPVC.SortDescriptions.Clear();
SortDescription sd = (SortDescription) e.NewItems[0];
if (sd.PropertyName == "description")
{
e.NewItems.Clear();
using (MyPVC.DeferRefresh())
{
ObservableCollection<MyClass> source = ((ObservableCollection<MyClass>)MyPVC.SourceCollection);
if (source == null)
return;
bool asc = (sd.Direction == ListSortDirection.Ascending);
var source1 = new List<MyClass>(source);
source1.Sort((a, b) =>
{
int left = 0;
int right = 0;
var ret = 0;
if (int.TryParse(a.description, out left) && int.TryParse(b.description, out right))
{
ret = (left < right) ? -1 : (left == right) ? 0 : 1;
if (!asc)
ret = -ret;
}
return ret;
});
var newsource = new ObservableCollection<MyClass>(source1);
MyPVC = new PagedCollectionView(newsource);
((INotifyCollectionChanged)MyPVC.SortDescriptions).CollectionChanged += SortCollectionChanged;
MyPVC.SortDescriptions.Clear();
}
MyClassDataGrid.ItemsSource = MyPVC;
MyPVC.Refresh();
}
if (sd.PropertyName == "Type")
{
MyPVC.SortDescriptions.Clear();
//MyPVC = new PagedCollectionView(MyPVC);
e.NewItems.Clear();
using (MyPVC.DeferRefresh())
{
ObservableCollection<MyClass> source = ((ObservableCollection<MyClass>)MyPVC.SourceCollection);
if (source == null)
return;
bool asc = (sd.Direction == ListSortDirection.Ascending);
var source1 = new List<MyClass>(source);
source1.Sort((a, b) =>
{
int left = 0;
int right = 0;
var ret = 0;
if (int.TryParse(a.Type, out left) && int.TryParse(b.Type, out right))
{
ret = (left < right) ? -1 : (left == right) ? 0 : 1;
if (!asc)
ret = -ret;
}
return ret;
});
var newsource = new ObservableCollection<MyClass>(source1);
MyPVC = new PagedCollectionView(newsource);
((INotifyCollectionChanged)MyPVC.SortDescriptions).CollectionChanged += SortCollectionChanged;
MyPVC.SortDescriptions.Clear();
}
}
}
}
}
private void MyClasstableView_ColumnHeaderClick(object sender, ColumnHeaderClickEventArgs e)
{
((INotifyCollectionChanged) MyPVC.SortDescriptions).CollectionChanged += SortCollectionChanged;
}
Какая ошибка вы получаете? И вы могли бы показать класс данных? Это очень помогло бы. – Danexxtone
thanx Dane для вас. У меня есть обход этой проблемы. Я сортирую коллекцию на основе другого поля – xoanon