【问题标题】:Display row numbers in Wpf Listview在 Wpf Listview 中显示行号
【发布时间】:2013-03-07 22:14:24
【问题描述】:

我有一个从 sql server 数据库创建的列表视图,如何包含行号?

            <ListView x:Name="lstName" Height="400" Canvas.Top="55" Width="450">
                <ListView.View>
                    <GridView>                     
                        <GridViewColumn Header="Number" Width="auto" 
                         DisplayMemberBinding="{Binding Path=Id}" />
                        <GridViewColumn Header="FirstName" Width="auto" 
                         DisplayMemberBinding="{Binding Path=FName}" />
                        <GridViewColumn Header="LastName" Width="auto" 
                         DisplayMemberBinding="{Binding Path=LName}" />
                        <GridViewColumn Header="StreetAddress" Width="auto" 
                         DisplayMemberBinding="{Binding Path=Street}" />
                        <GridViewColumn Header="City" Width="auto" 
                         DisplayMemberBinding="{Binding Path=City}" />
                        <GridViewColumn Header="State" Width="auto"
                         DisplayMemberBinding="{Binding Path=State}" />                       
                    </GridView>                        
                </ListView.View>
            </ListView>

【问题讨论】:

  • 你看到了吗:link

标签: c# wpf listview


【解决方案1】:

您可以将ListViewAlternationCount 设置为大于可以返回的可能行数的值。然后,绑定到ListView.AlternationIndex 以获取当前项的从零开始的索引。

【讨论】:

  • 有什么方法可以获取从 1 开始的索引号?
  • @Raven 您可以实现一个IValueConverter 来将基于零的索引转换为一个递增1 的值。但是,请注意AlternationIndex 方法在虚拟化发生时的限制:stackoverflow.com/questions/6511180/…
【解决方案2】:

我没有看到一个简单的方法来做到这一点,因为 WPF 的理念是绑定到数据,然后视图应该是独立的。

但我可以看到一种让它工作的技巧。

您将 (OneTime) 绑定到 ViewModel 中的 Counter 属性,并且在此属性的 get 访问器中,除了返回它之外,您还迭代了 counter

这样,每个ListView 项目都会有一个适当的索引。

但请注意该解决方案,之后您将无法将索引追溯到项目。如果您出于某种原因还需要这样做,您实际上应该在您的对象中创建一个 IdInTable 字段并在您的 ViewModel 中正确填充它。

【讨论】:

  • 我是 WPF 新手,但现在它只是一个简单的文本框、按钮和列表视图来获取数据!我正在做的是使用 linq to sql 来执行存储过程。文本框用于输入参数。调查您的建议!
  • 那么也许最干净的方法是以某种方式让您的 sql 请求返回一个 RowId 字段(或者您之后生成它),然后您只需绑定到您的 ListView 中的该字段。 ++ 解决方案有点老套,维护性不好。
  • 我认为您还必须记住在删除行后重新查询存储过程中的数据...以保持数字同步!
【解决方案3】:

这是一篇很老的帖子,我看到很多人问我们如何使用 AlternationCount 和 AlternationIndex 来避免从零开始的索引。因此,对于像我这样的其他用户正在寻找解决方案。你可以用一些不寻常(或者你可以说很奇怪)的解决方法来做到这一点,但它对我有用:

隐藏第一项行(状态为Model.Status):

<ListView.ItemContainerStyle>
  <Style TargetType="ListViewItem">
    <Style.Triggers>
      <DataTrigger Binding="{Binding Status}" Value="Status">
        <Setter Property="Visibility" Value="Collapsed" />
      </DataTrigger>
     </Style.Triggers>
 </Style>
 </ListView.ItemContainerStyle>

然后在第一行添加一个虚拟记录:

FileDetail fd = new FileDetail()
{
  FileName = "File Name",
  Count = "Count",
  Status = "Status",
  FilePath = "File Path"
};
FileList.Add(fd);

相应地管理整个代码中的迭代。

你还可以用那 0 行做一件事。可以隐藏原来的表头,把这0行作为表头。

<ListView.Resources>
  <Style TargetType="{x:Type GridViewColumnHeader}">
   <Setter Property="Visibility" Value="Collapsed" />
  </Style>
 </ListView.Resources>

【讨论】:

    猜你喜欢
    • 2021-02-16
    • 1970-01-01
    • 2010-11-17
    • 2011-01-08
    • 2016-02-23
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多