1

我正在尝试在 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 列按预期工作,但我想知道是否有一种方法可以在 Index 列中显示集合中当前元素的索引,因此我不必将其作为集合本身的数据项。

4

1 回答 1

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

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

于 2013-04-11T10:15:53.677 回答