Как мне использовать Comparer для сортировки списка , когда у меня есть несколько параметров на выбор?

#list #sorting #windows-phone-7

#Список #сортировка #windows-phone-7

Вопрос:

и спасибо, что посмотрели. Я пытаюсь расширить пример, который я нашел здесь. Моя проблема заключается в следующем:

Список в примере содержит страны: у каждой страны есть название, флаг, описание, заглавная буква и идентификатор. Я хотел бы использовать меню appbar, чтобы отсортировать список на странице в соответствии с любым выбранным параметром. XAML будет выглядеть следующим образом:

 <shell:ApplicationBar.MenuItems>
      <shell:ApplicationBarMenuItem Text="sort by capital..." Click="SortCapital_Click"/>
      <shell:ApplicationBarMenuItem Text="sort by ID..." Click="SortID_Click"/>
</shell:ApplicationBar.MenuItems>
  

Чтобы отделить различные сценарии сортировки по параметрам от порядка чтения из XML по умолчанию, мне пришлось создать некоторые дополнительные переменные и перегрузки и переопределить событие OnNavigatedTo:

 public interface ICountryRepository
{
    IList<CountryData> GetCountryList(); // called by constructor
    IList<CountryData> GetCountryList(string sortMode); // called when sort is clicked
    CountryData GetCountryById(int id);
}
  

 public class XmlCountryRepository : ICountryRepository
{
private static List<CountryData> countryList = null;


    static XmlCountryRepository()
    {
        XDocument loadedData = XDocument.Load("CountriesXML.xml");

        var data = from query in loadedData.Descendants("Country")
          select new CountryData
          {
              Name = (string)query.Element("Name"),
              Flag = (string)query.Element("Flag"),
              Description = (string)query.Element("Description"),
              Capital = (string)query.Element("Capital"),
              ID = (int)query.Element("ID"),
          };
        countryList = data.ToList();
    }

    public IList<CountryData> GetCountryList()
    {
        return countryList;
    }

    public IList<CountryData> GetCountryList(string sortMode)
    {
        switch (sortMode)
        {
            case "capital": // Sort by capital
                break;
            case "ID": // Sort by ID
                    break;
        }
        return countryList;
    }
  

и, наконец, в основном классе конструктор вызывает GetCountryList(), который считывает элементы в списке в порядке, указанном в исходном XML-файле. Моя текущая реализация использует обработчики щелчков меню приложения для установки флагов и повторного перехода на страницу, но должен быть лучший способ сделать это!

     private void SortID_Click(object sender, System.EventArgs e)
    {
        sortMode = "ID";
        sortModeChanged = true;
        NavigationService.Navigate(new Uri("List.xaml", UriKind.Relative));
    }

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);

        if (sortModeChanged)
        {
            ICountryRepository countryRepository = new XmlCountryRepository();
            this.list.ItemsSource = countryRepository.GetCountryList(sortMode);
            sortModeChanged = false;
        }
    }
  

Я попытался просмотреть пример сортировки в MSDN, но я не мог понять, как расширить его до более чем одного параметра разных типов (int, string и т.д.)

Ответ №1:

Вы должны привязать свой ListBox к CollectionViewSource с ObservableCollection в качестве источника. CVS будет использоваться как прокси, и на нем у вас будут возможности группировки и сортировки. Вот пример:

http://weblogs.asp.net/psheriff/archive/2010/07/22/sort-data-using-code-with-the-silverlight-collectionviewsource.aspx