如何在ListView中显示行号?

Ser*_*hov 26 wpf listview

显而易见的解决方案是在ModelView元素上使用行号属性,但缺点是在添加记录或更改排序顺序时必须重新生成这些属性.

优雅的解决方案吗?

ama*_*aca 42

我认为你优雅的解决方案,但这很有效.

XAML:

<ListView Name="listviewNames">
  <ListView.View>
    <GridView>
      <GridView.Columns>
        <GridViewColumn
          Header="Number"
          DisplayMemberBinding="{Binding RelativeSource={RelativeSource FindAncestor, 
                                         AncestorType={x:Type ListViewItem}}, 
                                         Converter={StaticResource IndexConverter}}" />
        <GridViewColumn
          Header="Name"
          DisplayMemberBinding="{Binding Path=Name}" />
      </GridView.Columns>
    </GridView>
  </ListView.View>
</ListView>
Run Code Online (Sandbox Code Playgroud)

ValueConverter:

public class IndexConverter : IValueConverter
{
    public object Convert(object value, Type TargetType, object parameter, CultureInfo culture)
    {
        ListViewItem item = (ListViewItem) value;
        ListView listView = ItemsControl.ItemsControlFromItemContainer(item) as ListView;
        int index = listView.ItemContainerGenerator.IndexFromContainer(item);
        return index.ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 一点点补充:如果你想让索引开始容易改变(基于0,基于1,无论......):`int paramValue; if(Int32.TryParse(参数为string,out paramValue))index + = paramValue;` (5认同)
  • 好的解决方案 我唯一的问题是,当更改列表(例如添加或删除项目)时,行号不会更新,因此我最终会出现重复和缺失的数字.有任何想法吗? (4认同)
  • 然后在XAML中,您可以执行:`(...)Converter = {StaticResource IndexConverter},ConverterParamter = 1}`用于从1开始的编号. (4认同)
  • 删除行时不更新数字. (4认同)

小智 6

如果您有一个动态列表,其中添加,删除或移动项目,您仍然可以使用这个非常好的解决方案,只需在源列表中的更改完成后让列表视图的当前视图自行刷新.此代码示例直接在数据源列表"mySourceList"(在我的示例中为ObservableCollection)中删除当前项,最后将行号更新为正确的值.

ICollectionView cv = CollectionViewSource.GetDefaultView(listviewNames.ItemsSource);
if (listviewNames.Items.CurrentItem != null)
{
    mySourceList.RemoveAt(cv.CurrentPosition);
    cv.Refresh();
}
Run Code Online (Sandbox Code Playgroud)


Vah*_*idN 5

首先您需要将设置AlternationCountitems count+1,例如:

<ListView AlternationCount="1000" .... />
Run Code Online (Sandbox Code Playgroud)

然后AlternationIndex将显示真实索引,即使在滚动期间:

 <GridViewColumn
       Header="#" Width="30"
       DisplayMemberBinding="{Binding (ItemsControl.AlternationIndex),
       RelativeSource={RelativeSource AncestorType=ListViewItem}}" />
Run Code Online (Sandbox Code Playgroud)

  • 我得到基于 0 的索引号,有什么方法可以得到从 1 开始的索引号吗? (2认同)