UWP Показать индекс ListViewItem - PullRequest
1 голос
/ 26 марта 2020

Я искал решение для отображения индексов элементов из ListView в течение нескольких часов. Я не могу добавить новое свойство в источник данных как свойство индекса для привязки к значению.

Я пытался привязать к конвертеру:

    <DataTemplate x:Key="TubeTemplate" x:DataType="data:Tube">
        <local:TubeTemplate HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
                            FavoritesNumber="{Binding Converter={StaticResource IndexConverter}}"
                            Closed="TubeTemplate_Closed"></local:TubeTemplate>
    </DataTemplate>

Это конвертер:

public sealed class IndexConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        var item = (ListViewItem)value;
        var listView = ItemsControl.ItemsControlFromItemContainer(item) as ListView;
        int index = listView.IndexFromContainer(item) + 1;
        return index.ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

Проблема в том, что мой код разрывается на: var item = (ListViewItem)value;

Значение, которое я получаю, это тип данных, связанный с каждым элементом, а не ListViewItem.

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

Используйте {RelativeSource Mode = TemplatedParent} в привязке. Затем вы можете получить ItemContainer с помощью VisualTreeHelper следующим образом.

<local:TubeTemplate ...
    FavoritesNumber="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Converter={StaticResource IndexConverter}}"
.../>

и

public object Convert(object value, Type targetType, object parameter, string language)
{
    var presenter = value as ListViewItemPresenter;
    var item = VisualTreeHelper.GetParent(presenter) as ListViewItem;

    var listView = ItemsControl.ItemsControlFromItemContainer(item);
    int index = listView.IndexFromContainer(item) + 1;
    return index.ToString();
}

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

1 голос
/ 26 марта 2020

Попробуйте использовать AlternationIndex . Также в соответствии с этим ответом , вы должны использовать ListViewItem в качестве RelativeSource

В вашем случае это будет выглядеть примерно так:

    <DataTemplate>
        <TextBlock Text="{Binding Path=(ItemsControl.AlternationIndex), 
            RelativeSource={RelativeSource AncestorType=ListViewItem},
            StringFormat={}Index is {0}}">
        </TextBlock>
    </DataTemplate>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...