添加行号Windows phone 7列表框

时间:2014-02-21 18:35:51

标签: c# xaml windows-phone-7 listbox

我遇到了问题,我不知道该怎么做。我想制作一个简单的高分榜,我需要得到每个分数的数字(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中得到支持吗?有什么想法吗?

谢谢!

1 个答案:

答案 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。