これが奇妙な動作をしている理由を誰かが説明できますか?
すべきことは、カウントをインクリメントし、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));
}
}
}
}