【问题标题】:UWP Display Index of ListViewItemListViewItem 的 UWP 显示索引
【发布时间】:2020-07-06 22:37:16
【问题描述】:

几个小时以来,我一直在寻找一种解决方案来显示 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;

我得到的值是绑定到每个项目的 DataType,而不是 ListViewItem。

我做错了什么?

【问题讨论】:

  • 第一:为什么不能给模型添加索引属性?其次:您缺少 value 所依赖的 Binding 的 ConverterParameter 属性。
  • 如果只使用Binding关键字,则会绑定创建这个DataTemplate的数据模型,即Tube类的一个实例。如果要获取索引,建议将索引写入Tube类并绑定属性,而不是通过模板元素向上查询父元素

标签: c# listview uwp


【解决方案1】:

尝试使用 AlternationIndex。同样根据这个answer,你应该使用 ListViewItem 作为RelativeSource

在你的情况下,它看起来像

    <DataTemplate>
        <TextBlock Text="{Binding Path=(ItemsControl.AlternationIndex), 
            RelativeSource={RelativeSource AncestorType=ListViewItem},
            StringFormat={}Index is {0}}">
        </TextBlock>
    </DataTemplate>

【讨论】:

  • "成员 AncestorType 无法识别或不可访问。"和“属性 AncestorType 未在 RelativeSource 中找到。”
  • 抱歉,愚蠢的错误 FindAncestor 在 UWP 中不存在。我会检查有没有办法解决这个问题。
【解决方案2】:

在绑定中使用 {RelativeSource Mode=TemplatedParent}。然后,您可以在 VisualTreeHelper 的帮助下获取 ItemContainer,如下所示。

<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();
}

但是,以这种方式显示的索引不会在集合更改时自动更新。因此,如果您之后要删除一些项目,则必须实现另一个函数来请求每个项目重新加载其索引。

【讨论】:

  • 谢谢!而且你是对的,一旦删除了一个项目,你就必须手动更新索引。
猜你喜欢
  • 2021-07-08
  • 1970-01-01
  • 2020-07-06
  • 2016-10-27
  • 2011-06-16
  • 2016-10-04
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
相关资源
最近更新 更多