Как использовать Comparer для сортировки списка <T>, когда у меня есть несколько параметров на выбор? - PullRequest
1 голос
/ 05 июня 2011

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

Список в примере содержит страны: у каждой страны есть имя, флаг, описание, столица и идентификатор.Я хотел бы использовать меню панели приложений, чтобы отсортировать список на странице по любому выбранному параметру.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 Ответ

0 голосов
/ 15 июня 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...