从网络上看到的两种方式,一种是,在 codebehind 里为 控件写事件,下面是将集合绑定到 DataGrid 控件:

private void DataGridSoftware_LoadingRow(object sender, DataGridRowEventArgs e)
{
e.Row.Header = e.Row.GetIndex() + ;
}

貌似可行,但是先不说 mvvm 下这种方式的可行性,更新列表某一项,就必须得再写一套处理逻辑。

于是,直接在 ViewModel 里定义一个 Index 属性就成为了另一个可行的方法:

    public class MainDataViewModel : ObservableObject
{
private string _MyProperty;
public string MyProperty
{
get { return _MyProperty; }
set
{
_MyProperty = value;
RaisePropertyChanged("MyProperty");
}
} private int _Index;
public int Index
{
get { return _Index; }
set
{
_Index = value;
RaisePropertyChanged("Index");
}
}
}

结果同样令人汗颜, 因为同样得自己处理逻辑为定义的 Index 属性动态更改数值,不然位置一样是假的。

接下来还试过几种方式,都觉得很乱,需要处理的东西太多,到底有没有一个好的方式去搞定他呢!

首先,系统的看一下微软的MSDN -- <数据绑定概述> 这一节,一开始你会觉得哎呀太简单了,但是切入点就在这里。

你会发现两段代码,不是很显眼:

<Window.Resources>
... <CollectionViewSource
Source="{Binding Source={x:Static Application.Current}, Path=AuctionItems}" x:Key="listingDataView" />
...
</Window.Resources> <ListBox Name="Master" Grid.Row="2" Grid.ColumnSpan="3" Margin="8"
ItemsSource="{Binding Source={StaticResource listingDataView}}">
... </ListBox>

答案就在这里,切入点就是 CollectionView

其实接下来,我就不知道该如何去做了,只是隐隐的感觉到它就是能解决问题的关键,但是我不甘心就在这里停下,就跟着微软的示范(后面有提到),将这个CollectionView加入了Converter:

    /// <summary>
/// 获取 定义视图中 该项的位置,从 1 开始
/// </summary>
[ValueConversion(typeof(object), typeof(int))]
public class Item2IndexConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
int resault = ;
var iLi = parameter as CollectionViewSource;
if (null != iLi)
{
CollectionView cv = (CollectionView)iLi.View;
resault = cv.IndexOf(value) + ;
}
return resault > ? resault : System.Windows.DependencyProperty.UnsetValue;
} public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}

于是,控件的获取就简单了,把你的当前项和视图,都传进来,我判断一下这个项在哪个位置就行了。

前台如果是DataGrid,就是类似于这样:

    <Window.Resources>
<converter:Item2IndexConverter x:Key="item_index_converter"/>
<CollectionViewSource Source="{Binding VmMainDataListing}" x:Key="listingDataView" />
</Window.Resources> <Grid>
<DataGrid RowHeaderWidth="40" ItemsSource="{Binding Source={StaticResource listingDataView}}" >
<DataGrid.RowHeaderStyle>
<!-- 显示行号 -->
<Style TargetType="{x:Type DataGridRowHeader}">
<Setter Property="Content" Value="{Binding Converter={StaticResource item_index_converter},ConverterParameter={StaticResource listingDataView}}" />
</Style>
</DataGrid.RowHeaderStyle>
<DataGrid.Columns>
列表内容
</DataGrid.Columns>
</DataGrid>
</Grid>

整体的思路如下:

1.首先,我们的列表类型控件,获取到的源,是一个中间提供者——CollectionViewSource,他支持数据的封装,用于显示方面的排序、分组、序列

2.有了这种会自己更改排序的源,我们就可以放心的将前台序号的统计任务交给他,剩下的工作就是获取我们想要的序号。

3.获取序号的方式,是采用了微软的示范代码的形式,使用Converter进行获取,可以在 《DataGrid.RowHeaderStyle》的介绍页面的示范下找到,不过它的源是直接获取的一个控件,这种方式实际应用起来是不可行的。

最后,如果你们有更好的法子,请留言交流,期待你们的墨水……

为 ItemsControl 类型的控件提供行号,mvvm模式 绑定集合的更多相关文章

  1. ASP.NET 迭代控件获得行号

    如何获取Repeater的当前行号,其实Repeater自身就带有这个获取当前行号的属性,而无需程序员绑定这个行号.到底要怎么实现呢?其实使用Repeater中的 Container.ItemInde ...

  2. C#WinForm的DataGridView控件显示行号

    public void ShowIndex(DataGridView dgv)        {                       for (int i = 0; i < dgv.Ro ...

  3. 背水一战 Windows 10 (53) - 控件(集合类): ItemsControl 的布局控件 - ItemsStackPanel, ItemsWrapGrid

    [源码下载] 背水一战 Windows 10 (53) - 控件(集合类): ItemsControl 的布局控件 - ItemsStackPanel, ItemsWrapGrid 作者:webabc ...

  4. 背水一战 Windows 10 (54) - 控件(集合类): ItemsControl 的布局控件 - OrientedVirtualizingPanel, VirtualizingStackPanel, WrapGrid

    [源码下载] 背水一战 Windows 10 (54) - 控件(集合类): ItemsControl 的布局控件 - OrientedVirtualizingPanel, VirtualizingS ...

  5. WPF编程,通过KeyFrame 类型制作控件线性动画的一种方法。

    原文:WPF编程,通过KeyFrame 类型制作控件线性动画的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/articl ...

  6. SPC软控件提供商NWA的产品在各行业的应用(包装行业)

    Northwest Analytical (NWA)是全球领先的“工业4.0”制造分析SPC软件控件提供商.产品(包含: NWA Quality Analyst , NWA Focus EMI 和 N ...

  7. SPC软控件提供商NWA的产品在各行业的应用(石油天然气行业)

    Northwest Analytical (NWA)是全球领先的“工业4.0”制造分析SPC软件控件提供商.产品(包含: NWA Quality Analyst , NWA Focus EMI 和 N ...

  8. SPC软控件提供商NWA的产品在各行业的应用(生命科学行业)

    在上一篇文章中,我们提到了NWA软件产品在各行业都有广泛的应用,并且就化工行业的应用展开了详细介绍.而在本文中,您将看到NWA产品在生命科学行业也扮演着不可替代的角色. Northwest Analy ...

  9. SPC软控件提供商NWA的产品在各行业的应用(化工行业)

    Northwest Analytical (NWA)是全球领先的“工业4.0”制造分析SPC软件控件提供商.产品(包含: NWA Quality Analyst , NWA Focus EMI 和 N ...

随机推荐

  1. [EffectiveC++]item35:考虑virtual函数以外的其他选择

    本质上是说了:   Template Pattern & Strategy Pattern 详细见<C++设计模式 23种设计模式.pdf 55页> 宁可要组合 不要继承. ——— ...

  2. 在前端页面展示Markdown文件

    常我们都会在GitHub上浏览很多的readme文件,这些都是Markdown语法写成的Markdown文件,HTML中并没有用于展示Markdown文件的元素,那么为什么可以在前端展示呢? 有别于G ...

  3. WAS8.5安装和部署

    刚研究WAS8.5的安装部署,写一些注意事项: 1.下载安装软件 安装器:agent.installer.linux.gtk.x86_64_1.7.2000.20140227_0303 WAS: WA ...

  4. java的串行化

    参考博客:Java 对象的串行化(Serialization) 1,什么是串行化 对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把对象 ...

  5. 【[AHOI2009]中国象棋】

    计数类dp还是要多写啊 看上去并没有什么思路,加上被题解里状压的标签迷惑了,于是就去看了一眼题解里设计的状态 之后就很好做了 首先先搞明白这道题的本质,就是对于任何一行任何一列炮的个数都不能超过\(2 ...

  6. JDBC(1)简单介绍/数据库的连接

    初识JDBC: JDBC是java连接数据库的一个工具,没有这个工具,java将无法和数据库进行连接. JDBC API: JDBC是个“低级”接口,也就是说,他直接用于调用SQL命令. JDBC驱动 ...

  7. if __name__ == "__main__"如何正确理解

    粗略来讲,__name__是当前模块,当模块被直接运行时模块名为__main__.这句话的意思是,当模块被直接执行时,代码将运行,当模块是被导入时,代码不被运行 例如,执行one.py # file ...

  8. [后台管理]一套用vue搭建的框架

    1.提前的准备工作 前端开发工具有许多,当下流行的sublime等等都是前端比较受欢迎的,nodeJS和Vue等都是前端框架搭建流行的一套 安装nodeJS 设置环境变量 安装Visual Studi ...

  9. 使用ITextSharper小结

    用到了生成PDF版的合同,上网研究了一圈,发现不需要服务器端安装插件的,比较好用的就是这个ITextSharper了,于是便开始了研究. 1.解决汉字不显示的问题,指定一下字体,默认的字体好像不支持中 ...

  10. java多线程注意事项

    1:继承thread和实现Runnable创建线程的区别: 继承thread创建的对象直接start()就可以就绪,但是使用Runnable所new出来的对象要先new Thread(xx)才能sta ...