Отображать элементы в наблюдаемой коллекции в виде кругового связанного списка - PullRequest
0 голосов
/ 27 июня 2018

У меня есть коллекция Observable, заполненная элементами и кнопкой, эти элементы упорядочены по убыванию их идентификатора

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

Я хочу отображать информацию для каждого элемента в каждом клике ниже:

Отображение первого щелчка Информация об элементе 1, отображение щелчка второго звука информация о Item2 .... Пятый щелчок отображает Item5 информация, Шестой щелчок отображает информацию Item1 .. и и так далее.

Как я могу отобразить Предметы в наблюдаемой коллекции в виде кругового связанного списка? когда я отображаю второй элемент, как я могу выделить первый элемент в конце списка?

Надеюсь, что это ясно

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Вы можете установить 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 дублируется для обеспечения циклического поведения в любом сценарии.

0 голосов
/ 27 июня 2018

Просто сбросьте значение оператора индекса обратно на ноль :

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; }
}
...