2016-04-16 8 views
0

Мне интересно, какой лучший подход к моей проблеме. Мне нужно создать DataGrid для моих данных. Мои данные выглядят так:Wpf привязки столбцов к списку

Competitor{ 
    public string Name {get; set;} 
    public string Sname {get; set;} 
    public List<TimeSpan> Laps {get; set;} 
} 

Название и SName известны с самого начала. Когда конкуренты делают круг, он получает свой Lap TimeSpan.

Таким образом, после 5 кругов DataGrid должен выглядеть следующим образом:

Name | SName | Lap1 | Lap2 | Lap3 | Lap4 | Lap5 
asd | dsa | 1:1:1 | 1:2:1 | 1:0:1 | 1:2:2 | 1:3:1 
bbb | cccc | 2:2:2 | 2:1:1 | 1:0:0 | 2:0:0 | 1:2:3 
... 

Я проверил этот подход http://blogs.msmvps.com/deborahk/populating-a-datagrid-with-dynamic-columns-in-a-silverlight-application-using-mvvm/ но это не exacly то, что я ожидал.

Любая идея, как это сделать? (любой другой, затем вручную добавив столбец с новым кругом, он должен быть автоматически добавлен)

ответ

1
  1. Держите DataTable для ваших записей. Привяжите это DataTable с DataGrid'sAutogenerateColumns к true.

  2. Изменить List<Timespan>ObservableCollection<Timespan> для кругов. ObservableCollection пожары CollectionChanged событие, когда предмет добавлен/удален.

  3. Ручка CollectionChanged событие и обновление DataTable с добавлением дополнительных столбцов.

  4. Теперь нам нужно обновить DataGrid, иначе он не покажет дополнительные столбцы. Он покажет новую добавленную строку, но дополнительные столбцы не будут показаны. Итак, сделайте следующее:

    Dgrid1.ItemsSource = null; 
        Dgrid1.ItemsSource = oldDataTable.DefaultView; 
    
+0

Задумывался о DataTable и из-за нехватки времени будет использовать этот подход, поэтому спасибо –

1

Если вы можете использовать ListBox вместо DataGrid. Вы можете сделать это:.

** XAML

<StackPanel> 
      <!--Header--> 
      <StackPanel Orientation="Horizontal" Margin="5 0 0 0"> 
       <TextBlock Width="100" Text="Name"/> 
       <TextBlock Width="100" Text="Sname"/> 
       <ListBox x:Name="ListHeader" BorderThickness="0"> 
        <ListBox.ItemTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding}" Width="100"/> 
         </DataTemplate> 
        </ListBox.ItemTemplate> 
        <ListBox.ItemsPanel> 
         <ItemsPanelTemplate> 
          <VirtualizingStackPanel Orientation="Horizontal" /> 
         </ItemsPanelTemplate> 
        </ListBox.ItemsPanel> 
       </ListBox> 
      </StackPanel> 

      <!--List of Competitors--> 
      <ListBox x:Name="Mylist"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <TextBlock Width="100" Text="{Binding Name}"/> 
          <TextBlock Width="100" Text="{Binding Sname}"/> 
          <ListBox ItemsSource="{Binding Laps}" BorderThickness="0"> 
           <ListBox.ItemTemplate> 
            <DataTemplate> 
             <TextBlock Text="{Binding}" Width="100"/> 
            </DataTemplate> 
           </ListBox.ItemTemplate> 
           <ListBox.ItemsPanel> 
            <ItemsPanelTemplate> 
             <VirtualizingStackPanel Orientation="Horizontal" /> 
            </ItemsPanelTemplate> 
           </ListBox.ItemsPanel> 
          </ListBox> 
         </StackPanel> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
     </StackPanel> 

** CS

public MainWindow() 
     { 
      InitializeComponent(); 
      List<Competitor> list = new List<Competitor>(); 
      list.Add(new Competitor { Name = "Renee", Sname = "Lewallen", Laps = new List<TimeSpan> { TimeSpan.Parse("00:10"), TimeSpan.Parse("00:20"), TimeSpan.Parse("00:30") } }); 
      list.Add(new Competitor { Name = "Barney", Sname = "Fett", Laps = new List<TimeSpan> { TimeSpan.Parse("00:10"), TimeSpan.Parse("00:20"), TimeSpan.Parse("00:30"), TimeSpan.Parse("00:40") } }); 
      list.Add(new Competitor { Name = "Nelle", Sname = "Butterfield", Laps = new List<TimeSpan> { TimeSpan.Parse("00:10"), TimeSpan.Parse("00:20"), TimeSpan.Parse("00:30"), TimeSpan.Parse("00:40"), TimeSpan.Parse("00:50") } }); 
      list.Add(new Competitor { Name = "Marc", Sname = "Soriano", Laps = new List<TimeSpan> { TimeSpan.Parse("00:10"), TimeSpan.Parse("00:20") } }); 
      list.Add(new Competitor { Name = "Cathi", Sname = "Stumpff", Laps = new List<TimeSpan> { TimeSpan.Parse("00:10"), TimeSpan.Parse("00:20"), TimeSpan.Parse("00:30") } }); 
      list.Add(new Competitor { Name = "Jefferey", Sname = "Hunziker", Laps = new List<TimeSpan> { TimeSpan.Parse("00:10"), TimeSpan.Parse("00:20"), TimeSpan.Parse("00:30") } }); 
      list.Add(new Competitor { Name = "Berniece", Sname = "Courtney", Laps = new List<TimeSpan> { TimeSpan.Parse("00:10"), TimeSpan.Parse("00:20"), TimeSpan.Parse("00:30") } }); 

      var LapsCounter = list.Select(w => w.Laps.Count).Max(); 

      List<string> listH = new List<string>(); 
      for (int i = 1; i <= LapsCounter; i++) 
      { 
       listH.Add("Lap" + i); 
      } 
      Mylist.ItemsSource = list; 
      ListHeader.ItemsSource = listH; 

     } 

     public class Competitor 
     { 
      public string Name { get; set; } 
      public string Sname { get; set; } 
      public List<TimeSpan> Laps { get; set; } 
     } 

Результат:. enter image description here

+0

это подобный подход к одному я связан в моем первом посте. Он выглядит неплохо, но у вас нет возможности легко выбирать или сортировать по определенному кругу. Уверен, что это можно переоценить, но будет недостаток гибкости. –

Смежные вопросы