将可观察集合中的项目显示为循环链接列表

时间:2018-06-27 11:25:41

标签: c# wpf collections observablecollection

我有一个由项目和按钮填充的Observable集合,这些项目按其ID降序排列

ocItems = new ObservableCollection<Item>();
IQueryable<Item> Query = _context.Item.OrderByDescending(s=>s.ItemID);
ocItems = new ObservableCollection<Item>(Query );

我想通过以下方式显示每次单击中每个项目的信息:

  

第一次单击显示Item1信息,第二次单击显示   Item2信息...。第五次单击显示Item5   信息,第六次单击显示Item1信息 ..,   等等。

如何将可观察集合中的项目显示为循环链接列表? 当我显示第二个项目时,如何在列表末尾显示第一个项目?

希望这很清楚

2 个答案:

答案 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的使用是重复的,以确保在任何情况下都具有循环行为。