[英]UWP Display Index of ListViewItem
幾個小時以來,我一直在尋找一種解決方案來顯示 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。
我究竟做錯了什么?
在綁定中使用 {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();
}
但是,以這種方式顯示的索引不會在集合更改時自動更新。 因此,如果您之后要刪除一些項目,則必須實現另一個函數來請求每個項目重新加載其索引。
嘗試使用AlternationIndex 。 同樣根據這個答案,你應該使用 ListViewItem 作為RelativeSource
在你的情況下,它看起來像
<DataTemplate>
<TextBlock Text="{Binding Path=(ItemsControl.AlternationIndex),
RelativeSource={RelativeSource AncestorType=ListViewItem},
StringFormat={}Index is {0}}">
</TextBlock>
</DataTemplate>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.