自动过滤/订购ListBox项目(Windows Phone)

时间:2016-11-28 13:45:30

标签: c# sorting listbox windows-phone-8.1 windows-phone-silverlight

我想确保我的列表框中添加的项目按照每个项目的序列号按升序排序(例如1项,2项,4项,3项应根据其编号自动排序1.2.3 ....... 10)。

这是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>

1 个答案:

答案 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 模式,数据绑定 INotifyPropertyChanged 。这些对于构建可维护且稳定的Windows应用程序非常重要。

此外,我认为学习一些更好的C#代码约定会更有帮助 - 为了更好的可读性和更一致的变量命名(避免像Settings1listobj这样的事情),注释和代码结构。这需要时间,但最终结果非常值得付出努力:-)。