0

リスト ボックスに追加されたアイテムが、各アイテムのシリアル番号に従って昇順で並べられるようにしたい (たとえば、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>
4

1 に答える 1

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>

全体的なアドバイス

ご覧のとおり、このコードは保守と機能維持が非常に難しくなっています。そのため、特にMVVMパターン、データ バインディング、およびINotifyPropertyChangedについて学ぶために、デザイン パターンまたは Windows アプリ開発に関する本を読むことをお勧めします。これらは、保守可能で安定した Windows アプリケーションを構築する上で非常に重要です。

Settings1また、より一貫性のある変数の命名 ( 、 などを避けるlistobj)、コメント、およびコード構造を使用して読みやすくするために、より良い C# コード規則を学ぶことも役立つと思います。時間はかかりますが、最終結果は努力する価値があります :-) .

于 2016-12-12T20:00:37.080 に答える