如何获得当前集合元素的索引,同时与DataGridTemplateColumn构建DataGrid
本文关键字:DataGridTemplateColumn DataGrid 构建 索引 何获得 前集 集合 元素 | 更新日期: 2023-09-27 18:08:31
我试图在DataGrid中显示这样的数组:
XAML:
<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="Index" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Items, Path=}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Name" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Items, Path=Name}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
Name列按预期工作,但我想知道是否有一种方法可以在索引列中显示集合中当前元素的索引,因此我不必将其作为集合本身的数据项。
我刚刚创建了这个
<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False" Name="DGrid">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Index" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Tag="{Binding}" Loaded="TextBlock_Loaded" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Name" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
和代码:
public partial class MainWindow : Window
{
List<Item> items = new List<Item>();
public MainWindow()
{
InitializeComponent();
for (int i = 0; i < 10; i++)
items.Add(new Item() { Name = Guid.NewGuid().ToString() });
DGrid.DataContext = items;
}
private void TextBlock_Loaded(object sender, RoutedEventArgs e)
{
var block = sender as TextBlock;
var item = block.Tag as Item;
block.Text = items.IndexOf(item).ToString();
}
}
public class Item
{
public string Name { get; set; }
}
这不是一个漂亮的解决方案,但它有效。如果你更喜欢使用绑定而不是事件,我猜你可以创建一个包含Item
内部的Item
集合的引用,然后创建一个属性,将返回索引,像这样:
public class Item
{
public List<Item> ItemCollection { get; set; }
public string Index
{
get
{
return ItemCollection.IndexOf(this).ToString();
}
}
public string Name { get; set; }
}
然后修改两行:
items.Add(new Item() { Name = Guid.NewGuid().ToString(), ItemCollection = items });
和
<TextBlock Text="{Binding Index}" />
老实说,我不确定这是否是最好的方法。div;)