Как использовать CollectionViewSource для сортировки записей XML по дате? - PullRequest
1 голос
/ 07 ноября 2011

У меня есть следующий 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 Ответ

1 голос
/ 08 ноября 2011

Я подозреваю, что это может быть основным недостатком работы с чистым 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()));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...