0

Я хочу, чтобы элементы, добавленные в моем списке, упорядочивались в порядке возрастания в соответствии с порядковым номером каждого элемента (например, 1 элемент, 2 пункта, 4 элемента, 3 пункт должен автоматически заказываться в соответствии с его номером 1.2.3 ....... 10).Автоматически фильтровать/заказывать элементы ListBox (Windows Phone)

Здесь C# источник:

namespace XeroQuiz 
{ 

    public partial class MainPage : PhoneApplicationPage 
    { 
    IsolatedStorageFile Settings1 = IsolatedStorageFile.GetUserStoreForApplication(); 
    MyDataList listobj = new MyDataList(); 

    public MainPage() 
    { 
     InitializeComponent(); 
     this.Loaded += MainPage_Loaded; 
     this.FavoriteListBox.Visibility = Visibility.Collapsed; 
     if (Settings1.FileExists("MyStoreItems")) 
     { 
      using (IsolatedStorageFileStream fileStream = Settings1.OpenFile("MyStoreItems", FileMode.Open)) 
      { 
       DataContractSerializer serializer = new DataContractSerializer(typeof(MyDataList)); 
       listobj = (MyDataList)serializer.ReadObject(fileStream); 

      } 
     } 
     FavoriteListBox.ItemsSource = listobj;//binding isolated storage list data 

     DispatcherTimer timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(0.5) }; 
     timer.Tick += delegate (object sender, EventArgs e) 
     { 
      // var sortedList = listobj.OrderBy(item => item.AnswerName).ToList(); code is correct but no item is sorted in list. 
      this.FavoriteListBox.ItemsSource = listobj; 
      this.FavoriteListBox.UpdateLayout(); 
     }; 
     timer.Start(); 
    } 


    /**************************************************************************/ 

    private void MainPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (Settings1.FileExists("MyStoreItems"))//loaded previous items into list 
     { 
      using (IsolatedStorageFileStream fileStream = Settings1.OpenFile("MyStoreItems", FileMode.Open)) 
      { 
       DataContractSerializer serializer = new DataContractSerializer(typeof(MyDataList)); 
       listobj = (MyDataList)serializer.ReadObject(fileStream); 
      } 
     } 
    } 


    private void FavoriteButton_Click(object sender, RoutedEventArgs e) 
    { 
     if (listobj.Any(l => l.AnswerName == AnswerTextBlock.Text)) 
      return; 
     //var sortedList = listobj.OrderBy(item => item.ToString()).ToList(); 
     listobj.Add(new MyData { AnswerName = AnswerTextBlock.Text }); 

     using (IsolatedStorageFileStream fileStream = Settings1.OpenFile("MyStoreItems", FileMode.Create)) 
     { 
      DataContractSerializer serializer = new DataContractSerializer(typeof(MyDataList)); 
      serializer.WriteObject(fileStream, listobj); 

     } 
    } 


    private void FavoriteRemoveButton_Click(object sender, RoutedEventArgs e) 
    { 
     lsitobj.Remove(listobj.FirstOrDefault(l => l.AnswerName == AnswerTextBlock.Text)); 

     using (IsolatedStorageFileStream fileStream = Settings1.OpenFile("MyStoreItems", FileMode.Create)) 
     { 
      DataContractSerializer serializer = new DataContractSerializer(typeof(MyDataList)); 
      serializer.WriteObject(fileStream, listobj); 

     } 
    } 
} 



    private void FavoriteListButton_Click(object sender, RoutedEventArgs e) 
    { 
     if (FavoriteListBox.Visibility.Equals(Visibility.Collapsed)) 
     { 
      FavoriteListBox.Visibility = Visibility.Visible;    
     } 
     else if (FavoriteListBox.Visibility.Equals(Visibility.Visible)) 
     { 
      FavoriteListBox.Visibility = Visibility.Collapsed; 
     } 
    } 




    public class MyData 
    { 
     public string AnswerName { get; set; } 
    } 
    public class MyDataList : ObservableCollection<MyData>//for storing mydata class items with type of list 
    { 

    } 


    private void FavoriteListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     MyData selecteddata = (sender as ListBox).SelectedItem as MyData;    
     if (selecteddata != null) 
     { 
      FavoritedData.Text = selecteddata.FrequencyName.ToString(); 
      using (IsolatedStorageFileStream fileStream = Settings1.OpenFile("MySelectedStoreItem", FileMode.Create)) 
      { 
       DataContractSerializer serializer = new DataContractSerializer(typeof(MyData)); 
       serializer.WriteObject(fileStream, selecteddata); 
      }     
     } 
    } 
} 

Вот код XAML:

<StackPanel Grid.Column="1" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Top">     
     <ListBox x:Name="FavoriteListBox" Visibility="Collapsed" 
       SelectionChanged="FavoriteListBox_SelectionChanged" 
       HorizontalAlignment="Stretch" 
       VerticalAlignment="Top" Opacity="1" 
       Background="{StaticResource PhoneBackgroundBrush}" Foreground="{StaticResource PhoneForegroundBrush}" 
       Height="300" Width="250"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Visibility="Visible" x:Name="FavoriteListBoxTextBlock" 
           FontSize="35" Foreground="Black" Text="{Binding AnswerName}"/> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </StackPanel> 

<StackPanel Grid.Row="0" Grid.Column= "0" HorizontalAlignment= "Left" VerticalAlignment= "Top" > 
< Button x:Name= "FavoriteButton" FontFamily= "Segoe MDL2 Assets" 
     Content= "&#xE006;" BorderBrush= "Transparent" FontSize= "28" 
     Foreground= "{StaticResource PhoneForegroundBrush}" 
     Style= "{StaticResource ButtonStyle1}" Click= "FavoriteButton_Click" /> 
</ StackPanel > 

<StackPanel Grid.Row="0" Grid.Column= "2" HorizontalAlignment= "Left" VerticalAlignment= "Top" > 
< Button x:Name= "FavoriteListButton" FontFamily= "Segoe MDL2 Assets" 
     Content= "&#xEA55;" BorderBrush= "Transparent" FontSize= "28" 
     Foreground= "{StaticResource PhoneForegroundBrush}" 
     Style= "{StaticResource ButtonStyle1}" Click= "FavoriteListButton_Click" /> 
</StackPanel> 
+0

Что такое текущий выход выглядит как ?? –

+0

Текущий вывод отображается в соответствии с «когда элемент добавлен», который добавлен первым, сначала будет отображаться первым, и наоборот –

ответ

1

В MainPage конструктору у вас есть код сортировки, но не установить содержание к , поэтому он не отображается в отсортированном порядке.

var sortedList = listobj.OrderBy(item => item.AnswerName).ToList(); 
this.FavoriteListBox.ItemsSource = sortedList; //you were using listobj, which isn't sorted 

Для FavoriteButton_Click обработчике похожей ситуации - вы разбирали и сохранение отсортированных результатов в новый список, который не влияет на исходный listobj экземпляр. OrderBy - это расширение LINQ, которое не влияет на исходный экземпляр, поэтому вы можете только очистить и повторно добавить элементы в исходный экземпляр вручную.

private void FavoriteButton_Click(object sender, RoutedEventArgs e) 
{ 
    if (listobj.Any(l => l.AnswerName == AnswerTextBlock.Text)) 
     return; 
    //add 
    listobj.Add(new MyData { AnswerName = AnswerTextBlock.Text }); 
    //sort (does not modify the original listobj instance!) 
    var sortedList = listobj.OrderBy(item => item.ToString()).ToList(); 

    //clear and re-add all items in the sorted order 
    listobj.Clear(); 
    foreach(var item in sortedList) 
    { 
     listobj.Add(item); 
    } 

    using (IsolatedStorageFileStream fileStream = Settings1.OpenFile("MyStoreItems", FileMode.Create)) 
    { 
     DataContractSerializer serializer = new DataContractSerializer(typeof(MyDataList)); 
     serializer.WriteObject(fileStream, listobj); 

    } 
} 

Кроме того, как предложение - вы не должны использовать MyDataList типа, вы можете напрямую использовать ObservableCollection<MyData> везде.

Общий совет

Как вы можете видеть, этот код становится довольно трудно сохранить и сохранить функционал. По этой причине я предлагаю вам прочитать какую-нибудь книгу о шаблонах дизайна или разработке приложений для Windows, особенно, чтобы узнать об MVVM pattern, данные привязки и INotifyPropertyChanged. Это очень важно для создания поддерживаемых и стабильных приложений Windows.

Также я думаю, что было бы полезно изучить некоторые более эффективные условные обозначения C# - для лучшей читаемости с более последовательным именованием переменных (избегая таких вещей, как Settings1, listobj), комментирования и структуры кода. Это требует времени, но конечный результат стоит усилий :-).

+0

ОК, я попробую, но сейчас мне нужна помощь в этом вопросе http://stackoverflow.com/questions/41074596/click-event-should-not-trigger-when-hold-event-perform/41076834 # 41076834 этот вопрос очень мал и понятен, но потратил часы и сделал много вещей, но нажал на события пожаров –

+0

Отлично, теперь мой список отсортирован автоматически в 1,2,3 ....... 9 формат спасибо :) –