我有一个由项目和按钮填充的Observable集合,这些项目按其ID降序排列
ocItems = new ObservableCollection<Item>();
IQueryable<Item> Query = _context.Item.OrderByDescending(s=>s.ItemID);
ocItems = new ObservableCollection<Item>(Query );
我想通过以下方式显示每次单击中每个项目的信息:
第一次单击显示Item1信息,第二次单击显示 Item2信息...。第五次单击显示Item5 信息,第六次单击显示Item1信息 .., 等等。
如何将可观察集合中的项目显示为循环链接列表? 当我显示第二个项目时,如何在列表末尾显示第一个项目?
希望这很清楚
答案 0 :(得分:3)
只需重置索引运算符值back to zero:
using System;
using System.Collections.ObjectModel;
public class Program
{
public static void Main()
{
var items = new []
{
new Item{ Id = 1, Value = "Hello" },
new Item{ Id = 2, Value = "World!" },
};
var collection = new ObservableCollection<Item>(items);
for(int i = 0; i < 10; i++)
{
var item = collection[i % collection.Count];
var message = String.Format("{0}: {1}", item.Id, item.Value);
Console.WriteLine(message);
}
}
}
public class Item
{
public int Id { get; set; }
public string Value { get; set; }
}
答案 1 :(得分:1)
您可以将每个项目的Tag
设置为属性的索引;喜欢:
//on click event:
(sender as TextBlock).Tag = ((int)((sender as TextBlock).Tag) + 1 ) % MAX;
或:
//on click command:
item.currentPropertyIndex = (item.currentPropertyIndex + 1 ) % MAX;
然后在GetPropertyValueAt
类中使用反射或方法(Item
)检索目标值:
public string GetPropertyValueAt(int index)
{
switch(index % MAX)
{
//default:
//return prop1;
}
}
或:
public string GetPropertyValueAt(int index)
{
this.GetType().GetProperties()[index % MAX];
}
如果您的Item
是链接列表,则:
public string GetPropertyValueAt(int index)
{
return this.ElementAt(index % MAX);
}
然后将Tag
添加到每个项目的绑定中:
<ItemsControl ItemsSource="{Binding ocItems}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource propSelector}">
<Binding Path=./>
<Binding Path="Tag" RelativeSource="{RelativeSource Self}/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
使用转换器,您可以为绑定创建自定义功能:
public class PropSelector : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (values != null)
{
return (values[0] as Item).GetPropertyValueAt(values[1]);
}
return "";
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}
别忘了将转换器添加到窗口的资源中。
请注意,% MAX
的使用是重复的,以确保在任何情况下都具有循环行为。