Wpf绑定列列表

时间:2016-04-16 18:14:46

标签: c# wpf mvvm datagrid

我想知道问题的最佳解决方法是什么。我需要为我的数据生成DataGrid。我的数据如下:

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/,但这并不是我所预期的。

知道如何完成这项工作吗? (任何其他人然后手动添加新的圆柱,它应自动添加)

2 个答案:

答案 0 :(得分:2)

如果可以使用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

答案 1 :(得分:2)

  1. 为您的记录保留DataTable。将此DataTableDataGrid's AutogenerateColumns绑定到true

  2. 将L List<Timespan>更改为ObservableCollection<Timespan>

  3. ObservableCollection会在添加/删除项目时触发CollectionChanged事件。

  4. 处理CollectionChanged事件并通过添加更多列来更新DataTable

  5. 现在,我们需要刷新DataGrid,否则它不会显示添加的额外列。它将显示添加的新行,但不会显示额外的列。所以,这样做:

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