将列动态添加到数据网格或使用列表中的特定列生成数据网格

Dynamically add a column to datagrid or generate datagrid with specific columns from a list

几天来我一直在与 datagrid databinding 作斗争..

我正在尝试从 list 个自定义 object 动态生成 datagrid。 因为我需要显示的 list-object 属性的数量可能会改变,所以我不知道确切的列数,也不知道它们的 headers.

所以我想,我将只动态添加我需要的列并为它们创建绑定(到特定的 object 属性)。之后,我将根据绑定使用 list 中的数据填充 datagrid

例如:

我创建一个空的datagrid

   <DataGrid x:Name="MyDataGrid" AutoGenerateColumns="false" ItemsSource="{Binding}" Margin="0,0,0,31" Grid.RowSpan="2">
   </DataGrid>

我创建了我的列表,用于存储我的数据和数据 object:

Public Class Res
    Public Shared TableData As New List(Of DataItem)
End Class

Public Class DataItem
    Public Property Name() As String
    Public Property MyProperty() As String
    Public Property Prop() As String
    Public Property Prop1() As String
End Class

现在,假设我只想在我的 datagrid 中显示 Name 列,所以我添加了一个具有特定绑定的列(大概这就是问题所在,但我不能搞清楚):

    Dim col As New DataGridTextColumn
    Dim bb As New Binding

    bb.Path = New PropertyPath("Name")
    bb.Mode = BindingMode.TwoWay
    bb.Source = Res.TableData

    col.Binding = bb
    col.Header = "Name"

    MyDataGrid.Columns.Add(col)

然后,我终于创建了一些数据并将其添加到我的列表中:

    Dim entry As New DataItem

    entry.Name = "Test Name"
    entry.MyProperty = "Test Property"
    entry.Prop = "one Entry"

    Res.TableData.Add(entry)

    Me.MyDataGrid.ItemsSource = Res.TableData

现在的结果是,整个列都填充了相同的数据。我的意图是仅填充与确切的 list 项对应的行。例如,如果我以后想用不同的 "Name" 向 list 添加另一个项目,它应该在 datagrid 中显示为另一行,也有不同的 "Name" .

我建议您将网格绑定到您的列表 属性,让 AutoGenerateColumns = True 并听取 AutoGeneratingColumn 在那里您决定是否要将该列添加到网格。