#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 будет использоваться как прокси, и на нем у вас будут возможности группировки и сортировки. Вот пример: