如何使用DataGridTemplateColumn构建DataGrid时获取当前集合元素的索引?

时间:2013-04-11 09:58:59

标签: c# wpf data-binding datagrid datagridtemplatecolumn

我正试图在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>

“名称”列按预期工作,但我想知道是否有一种方法可以在“索引”列中显示集合中当前元素的索引,因此我不必将其作为数据项中的数据项。收藏本身。

1 个答案:

答案 0 :(得分:1)

我刚刚创建了这个。

    <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}" />

我会说实话 - 我不确定这是否是最好的方法。 ;)