我有datagrid绑定ICollectionView列表对象。基本上,行是根据一列中的值进行过滤的。现在每行都有一个索引列。这基本上是行号。由于行被过滤,行号会发生变化。如何处理?
基本上,DataGrid绑定到类对象列表。
Class city
{
Int Index;
String Name;
string location;
}
List<city> Cities;
当我创建对象时,index具有根据索引中的项目数的值。因此第一个对象将具有index = 0,第二个将具有index = 1,依此类推。索引是网格中的一列。现在让我说我有2个位置迪拜的物体。和一个与开罗(第三个对象,索引= 3)。当我选择Cairo时,将显示该行。但由于我之前添加了索引,索引号= 3,因为我希望它为1,因为过滤器后面只有一行。
答案 0 :(得分:2)
如果要显示行索引,可以使用AlternationIndex。使用AlternationIndex
时,有两件事很重要:
AlternationCount
。这就像AlternationIndex
的计数限制之后,如果您的元素数量超过该数量,它将从0重新开始。理想情况下,如果您不希望它从0 {RelativeSource AncestorType=ListBoxItem}
{RelativeSource Mode=TemplatedParent}
请尝试以下示例:
<ListBox Name="CityListBox" AlterationCount={Binding CountOfItems}
<ListBox.ItemTemplate>
<DataTemplate DataType="City">
<TextBlock>
<Run Text="{Binding Name}"></Run>
<Run Text=" : "></Run>
<Run Text="{Binding Country}"></Run>
<Run Text=" : "></Run>
<Run Text="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem},
Path=(ItemsControl.AlternationIndex), Mode=OneWay}"></Run>
</TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<强>输出强>
CityA : CountryA : 0
CityB : CountryB : 1
CityC : CountryC : 2
答案 1 :(得分:0)
通常需要做的是先设置索引的值,然后应用过滤器。
包含System.Linq命名空间并添加以下内容
cities = cities.Select((item, index) =>
new city()
{
Index = index,
Name = item.Name,
location = item.location
});
这将返回第一个索引为零的城市列表。如果您希望从一个开始,只需将其更改为:
cities = cities.Select((item, index) =>
new city()
{
Index = index + 1,
Name = item.Name,
location = item.location
});
完成此操作后,您应该应用过滤器,除非您要更改值,否则不应覆盖过滤器。