如何让 WPF 中 ListBox 列表项前自动加上序号

有时候我们可以希望在 ListBox 列表项前面加上序号,这样看起来更清楚,还可以配合使用快捷键等。

希望达到如下图的效果:

显然我们可以通过修改 ListBox 的模板来实现,只要在 Item 中加上数字这一项即可,利用 MultiBinding 和 IMultiValueConverter 即可实现。

示例

首先,我们创建一个 Person 类:

public class Person
{
    public string Name { get; set; }
}

然后创建一个 Converter,继承自 IMultiValueConverter:

注意第 5~6 行,使用了 dynamic 类型,所以必须保证 list 有 IndexOf 这个扩展方法,IEnumerable<T> 是不行的。

public class IndexConverter : IMultiValueConverter
{
    public object Convert( object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        dynamic item = values[0];
        dynamic list = values[1];
        return list.IndexOf(person) + 1;
    }

    public object[] ConvertBack( object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException ();
    }
}

XAML 如下:

关键在于 17~20 行,分别绑定了单项数据和 ListBox 本身。

<Window x:Class="ListBoxIndex.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:listBoxIndex ="clr-namespace:ListBoxIndex"
        Title="MainWindow" Height ="350" Width="525">
    <Window.Resources>
        <listBoxIndex: IndexConverter x:Key="IndexConverter"/>
    </Window.Resources>
    <StackPanel >
        <Button Name="BtnDemo" Content="Add" Click="BtnDemo_OnClick"/>
        <ListBox Name="LbxDemo">
            <ListBox.ItemTemplate>
                <DataTemplate DataType="listBoxIndex:Person">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding}">
                            <TextBlock.DataContext>
                                <MultiBinding Converter="{StaticResource IndexConverter }">
                                    <Binding/>
                                    <Binding ElementName="LbxDemo" Path="ItemsSource"/>
                                </MultiBinding>
                            </TextBlock.DataContext>
                        </TextBlock>
                        <TextBlock Text="{Binding Name}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel >
</Window>

代码如下:

namespace ListBoxIndex
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        readonly ObservableCollection <Person> _personList = new ObservableCollection <Person>();

        public MainWindow()
        {
            InitializeComponent();
            InitSource();
        }

        private void InitSource()
        {
            _personList.Add(new Person() {Name = "刘备" });
            _personList.Add(new Person() {Name = "关羽" });

            LbxDemo.ItemsSource = _personList;
        }

        private void BtnDemo_OnClick( object sender, RoutedEventArgs e)
        {
            _personList.Add(new Person() {Name = "张飞" });
            LbxDemo.ItemsSource = _personList;
        }
    }
}

  

时间: 2024-09-29 23:25:44

如何让 WPF 中 ListBox 列表项前自动加上序号的相关文章

WPF中ListBox滚动时的缓动效果

原文:WPF中ListBox滚动时的缓动效果 上周工作中遇到的问题: 常规的ListBox在滚动时总是一格格的移动,感觉上很生硬. 所以想要实现类似Flash中的那种缓动的效果,使ListBox滚动时可以很流畅. 修改模板里的动画效果是一种方法,不过这里有更简单的,WPF为我们提供了行为代码,可以编辑在ListBox的ItemsPanelTemplate模板中,实现方法如下: 右键ListBox选择"编辑其它模板"->"辑项的布局"->"编辑副

开源学习--SlideExpandableListView中的列表项动画实现框架分析

前面的话 开源项目Android-SlideExpandableListView是一个简单的介绍列表项动画展示的小型项目,分析这个项目可以对自定义框架及列表类动画实现有个比较清晰的认识,工作中中时常根据需求扩展定义自己的适配器,虽然具体需求不同,但架构类似,本文把最近关于该开源项目的研究心得整理分享,共同学习~ 项目简介 github地址https://github.com/tjerkw/Android-SlideExpandableListView 这是个入门级的列表项动画展示框架,实现效果如

获取列表中某一个文件夹下的列表项集合(不包含子文件夹对象,也不包含子文件夹中的列表项)

RT,方法如下: 1 SPListItemCollection GetSubItemsWithoutFoldersInParrentFolder(SPFolder parrent) 2 { 3 SPList list = parrent.Item.ParentList; 4 SPQuery query = new SPQuery(); 5 query.Folder = parrent; 6 query.Query = "<Where><Eq><FieldRef Na

WPF中Listbox/ListView 横向展示/滑动内容的方法

<ListView Name="BoardListView" ScrollViewer.VerticalScrollBarVisibility="Hidden" Height="100" VerticalAlignment="Bottom"> <ListView.ItemsPanel> <ItemsPanelTemplate> <WrapPanel/> </ItemsPan

[R] 如何防止read.table读入数据时列名前自动加上&quot;X.&quot;?

最近用之前写的R脚本重新跑数据时,出现了报错.经检查,才发现是数据的列名读入R时发生了变化,列名前自动加上了X.符号. read.table系列函数有一个check.names参数,默认为 TRUE,因此读入数据时它会自动检查变量名在R中是否有效.如果变量名包含首字母为数字.#.$等情况时,则会自动加上X.,使变量看上去更像一个字符型变量. check.names是通过调用make.names函数来实现增加字符这一过程的,如列名为1,2, 3, 4, 5,6时,会自动加上X. make.name

转:WPF中ListBox的创建和多种绑定用法

先从最容易的开始演示ListBox控件的创建. Adding ListBox Items下面的代码是向ListBox控件中添加多项ListBoxItem集合.XAML代码如下:<ListBox Margin="10,10,0,13" Name="listBox1" HorizontalAlignment="Left"         VerticalAlignment="Top" Width="194"

ol列表中的列表项不显示

在写CSS的时候我们习惯在头部写 *{ margin:0px; padding:0px; } 或者,引入reset.css文件中.但是这个文件中也有对常用元素的边距置零的设置: 原因就在这个地方,默认li的list-style-position:outside,但是padding-left为0,所以,列表项就没有地方可以显示,如果padding-left设置为30px左右的话,就可以看到:

Windows Phone 7 ListBox 列表项渐显加载动画学习笔记

在wp7程序中,当程序功能越来越复杂时,性能问题是我们不得不考虑的一个问题.在聊天列表中,如果聊天项过多,而且项目UI组件足够复杂时, 我们不得不想尽办法让UI尽快加载.所以有一种可行的方案,就是像QQ聊天列表一样,从上至下,列表项逐一加载(加载完第一项,再加载第二项,再加载第三项,给用户尽快的UI响应,也不至于等待到显示所有的列表项. 在我们的例子中,我还给每个列表项显示的过程中加入了渐显动画,这样当列表项足够复杂时,也能表现出比较好的展示效果. 实现的基本原理: 实现的原理也不难,主要的思路

WPF Tips: Listbox SelectionChanged触发前的选项

想在Listbox的SelectionChanged事件触发时对之前的选项进行处理.但是listbox没有previewSelectionChanged事件. 解决办法: 1. Validation 因为要处理的项在TextBox中,所以可以给TextBox添加一个Validation.但是由于TextBox是与Property Binding,而Validation是在binding赋值之前进行操作(调试过程中是这样的流程),所以无法获取textbox中的值.如果没有binding应该是可以.