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; }
}

次に、次の 2 行を変更します。

            items.Add(new Item() { Name = Guid.NewGuid().ToString(), ItemCollection = items });

                        <TextBlock Text="{Binding Index}" />

正直に言うと、これが最善の方法かどうかはわかりません。;)

于 2013-04-11T10:15:53.677 に答える