Как мне использовать CollectionViewSource для сортировки XML-записей по дате?

#c# #wpf #xml

#c# #wpf #xml

Вопрос:

У меня есть следующий XML:

 <Memories>
<Memory Title="blah blah" ID="1">
  <ImageFile>Data/Images/01.jpg</ImageFile>
  <Blurb>We did blah</Blurb>
  <Date>06/11/2009</Date>
</Memory>
<Memory Title="Graduation" ID="2">
  <ImageFile>Data/Images/02.jpg</ImageFile>
  <Blurb>We graduated!</Blurb>
  <Date>29/11/2007</Date>
</Memory>
<Memory Title="Ski time!" ID="3">
  <ImageFile>Data/Images/03.jpg</ImageFile>
  <Blurb>Ski!!!!!</Blurb>
  <Date>19/12/2008</Date>
</Memory>
//...etc
</Memories>
  

И следующий XAML:

     <CollectionViewSource x:Key="dataCvs" Source="{StaticResource data}" >
        <CollectionViewSource.SortDescriptions >
            <scm:SortDescription PropertyName="Date" />
        </CollectionViewSource.SortDescriptions>
        <CollectionViewSource.GroupDescriptions >
            <dat:PropertyGroupDescription PropertyName="@Name" />
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>
  

Я хотел бы иметь возможность сортировать по дате, но в его текущей форме даты не будут сортироваться в естественном порядке дат; 06/11/2009 сортируется как до 19/12/2008, как и следовало ожидать от программы. Изменение моего формата даты на гггг / мм / дд вызвало бы у меня проблему, поскольку дата XML отображается как часть моей формы, и она должна отображаться как дд / мм / гггг. Может ли кто-нибудь, пожалуйста, просветить меня относительно того, как я могу отсортировать даты в соответствии с требованиями к отображению?

Большое спасибо, я был бы признателен за любую помощь.

Ответ №1:

Я подозреваю, что это может быть просто серьезным недостатком работы с чистым XML вместо преобразования их в бизнес-объекты. Исходные строковые значения умеют сортировать только буквенно-цифровым способом.

Если вы хотите решить проблему с помощью некоторого кода, вы можете использовать свойство ListCollectionView.CustomSort с пользовательским сортировщиком, который преобразует строки в соответствующий объект DateTime для сортировки.

 public class DateStringComparer : IComparer
{
    public int Compare(object x, object y)
    {
        return DateTime.Compare(DateTime.Parse(x.ToString()), DateTime.Parse(y.ToString()));
    }
}