我遇到了问题,我不知道该怎么做。我想制作一个简单的高分榜,我需要得到每个分数的数字(1,2,3,4 ......)。
XAML:
<ListBox x:Name="ListBox" ItemsSource="{Binding Source.View}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ROW_NUMBER_HERE}"/>
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding Score}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
C#
public ObservableCollection<Item> Items { get; set; }
public System.Windows.Data.CollectionViewSource Source { get; set; }
public HighscorePage()
{
IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();
if (store.FileExists("highscores"))
{
using (IsolatedStorageFileStream stream = store.OpenFile("highscores", FileMode.Open))
{
var serializer = new DataContractSerializer(typeof(ObservableCollection<Item>));
Items = (ObservableCollection<Item>)serializer.ReadObject(stream);
}
}
if (Items != null)
{
Source = new System.Windows.Data.CollectionViewSource();
Source.Source = Items;
Source.SortDescriptions.Add(new SortDescription("Score", ListSortDirection.Descending));
}
InitializeComponent();
DataContext = this;
}
Items ObservableCollection包含名称和分数数据。
我尝试使用普通的while循环来添加数字但没有成功。我也无法让AlternationCount工作。它甚至在wp7中得到支持吗?有什么想法吗?
谢谢!
答案 0 :(得分:1)
使用Select扩展进行计数和要绑定的新类,可以通过使用rownumbers创建备用列表来完成。方法如下:
创建一个扩展的Items Class(ItemsEx),它有一个额外的属性,int
属性为RowNumber
。还有一个复制构造函数,它接受Item
并将有效信息复制到克隆中。
拥有可观察的ItemsEx集合并存储旧的(如果需要在列表中):
public List<Item> Items { get; set; } // Original
public ObservableCollection<ItemEx> Items2 { get; set; } // Changed to hold the RowNumber
当您拥有隔离存储中的项目时,请创建ItemsEx实例,例如
var itemsToBePlaceInCollection
= Items.Select((itm, index) => new ItemEx(itm) { RowNumber = index + 1; })
.ToList();
.ForEach(itmEx => Items2.Add( itmEx )); // Add into the observable collection at this point
然后在Xaml中,DataContext设置为Items2,模板绑定到ItemEx的RowNumber
,这将反映存储中的计数,并显示您的行号。
坦率地说,如果未动态添加列表,则不清楚为什么需要ObservableCollection
。如果不是这样,那么只需使用INotifyPropertyChanged即时创建一个新列表将同样有效,而不是使用ObservableCollection。