2016-04-16 10 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'sAutogenerateColumnstrueにバインドします。

  2. 変更点List<Timespan>ObservableCollection<Timespan> for Laps。 ObservableCollectionアイテムが追加/削除されたときにイベントCollectionChangedが発生します。

  3. ハンドルCollectionChangedイベントと更新DataTableで列を追加しました。

  4. ここで、DataGridを更新する必要があります。それ以外の場合は追加された列は表示されません。追加された新しい行が表示されますが、追加の列は表示されません。だから、次の操作を行います。それは私が私の最初の記事でリンクされたものと類似のアプローチがある

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

DataTableについて考えていた、時間の欠如のためにこのアプローチを使用するので、ありがとう –

1

DataGridの代わりにListBoxを使用できる場合は、あなたはこれを行うことができます。

** 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

。それは良いように見えますが、特定のラップで簡単に選択または並べ替えることができます。確かにそれはオーバーライドすることができますが、柔軟性の欠如があるでしょう –