1

これが奇妙な動作をしている理由を誰かが説明できますか?

すべきことは、カウントをインクリメントし、3 ごとに新しい行を開始して、一度に 1 つずつ行に出力することです。つまり、

1

1,2

1,2,3

1,2,3 4

1,2,3 4,5

1,2,3 4,5,6

しかし、何をしているのかは次のとおりです。

1

1

1

1 4

1,2,3 4,5

その後、期待どおりに続行します。

1,2,3 4,5,6

Windows Phone 7 では ListBox を使用して期待どおりに動作しますが、Windows Phone 8 ではこの奇妙な動作をします。

このネストされたコレクション構造が必要なため、OnCollectionChanged を手動でトリガーします。

    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <phone:LongListSelector HorizontalAlignment="Left" Height="524" Margin="10,10,0,0" VerticalAlignment="Top" Width="446" Name="listBox1">
            <phone:LongListSelector.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}"/>
                </DataTemplate>
            </phone:LongListSelector.ItemTemplate>
        </phone:LongListSelector>
        <Button Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="164,539,0,-4" Click="Button_Click"/>
    </Grid>
using System.Linq;
using System.Windows;
using Microsoft.Phone.Controls;
using System.Collections.Specialized;
using System.Collections.ObjectModel;

namespace ObservableCollection
{
    public partial class MainPage : PhoneApplicationPage
    {
        private Rounds rounds = new Rounds();
        // Constructor
        public MainPage()
        {
            InitializeComponent();

            listBox1.ItemsSource = rounds;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            rounds.Add();
        }

        public class Round : Collection<int>
        {
            public string Name
            {
                get
                {
                    string s = "";
                    foreach (int i in this)
                    {
                        if (s.Length > 0)
                            s += ",";
                        s += i;
                    }
                    return s;
                }
            }
        }

        public class Rounds : ObservableCollection<Round>
        {
            public void Add()
            {
                int i = 1;

                if (Count > 0)
                    i = this.Last().Last() + 1;

                if (Count == 0 || this.Last().Count > 2)
                    Add(new Round());

                this.Last().Add(i);

                OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
            }
        }
    }
}
4

0 に答える 0