2013-04-11 27 views
1

我想顯示這樣一個DataGrid的數組:如何使用DataGridTemplateColumn構建DataGrid時獲取當前collection元素的索引?

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> 

名稱列正常工作,但我不知道是否有顯示方式Index列中集合中當前元素的索引,所以我不必將它作爲集合本身中的數據項。

回答

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

我會說實話 - 我不知道這是做THI的最佳方式秒。 ;)

+0

我認爲我更喜歡基於事件的解決方案,但我必須同意,這兩者都不相當。 – LJNielsenDk 2013-04-11 12:43:12

+1

我實際上認爲綁定版本就是要走的路......只是要求項目中引用的集合可以是PITA。 – Shaamaan 2013-04-11 14:02:16

相關問題