【问题标题】:How to bind a collection to datagrid column如何将集合绑定到数据网格列
【发布时间】:2019-06-24 08:34:45
【问题描述】:

我想将 Version 集合绑定到我的数据网格 -

public ObservableCollection<Version> versions { get; set; }

public class Version
{
     public string versionName { get; set; }
     public ObservableCollection<Revision> Revisions { get; set; }
}

public class Revision
{
    public string revNumber{ get; set; }
    public string Comment { get; set; }
}

数据网格应该如下所示 -

我知道如何将简单集合绑定到数据网格。但我的要求是显示单个版本名称的多个修订。我不知道该怎么做。

下面是我的 XAMl 代码 -

<DataGrid Grid.Column="1" Grid.Row="0" Name="DataGridVersion" RowHeaderWidth="0" CanUserAddRows="False" AutoGenerateColumns="False" ItemsSource="{Binding Path=versions}" CanUserDeleteRows="False" Margin="25.2,82,22,19" IsReadOnly="True">
        <DataGrid.Columns>
            <DataGridTextColumn Header = "Version" Binding = "{Binding versionName }" Width="0.35*" IsReadOnly="True"/>
            <DataGridTextColumn Header = "Revision"  Binding = "{Binding Revisions }" Width=" 0.2*" IsReadOnly="True"/>
            <DataGridTextColumn Header = "Comment" Binding = "{Binding comment }" Width="0.6*" IsReadOnly="True"/>
    </DataGrid>

提前致谢!

【问题讨论】:

    标签: wpf mvvm datagrid


    【解决方案1】:

    您应该检查 Datagrid 控件的Grouping function。

    编辑:查看您的数据结构,您还可以创建一个 DatagridTemplateColumn 并添加一个列表框,其 itemssource 绑定到 Revisions 属性。

    【讨论】:

      【解决方案2】:

      您可以将DataGridTemplateColumn 与ItemsControl 一起使用:

      <DataGrid Grid.Column="1" Grid.Row="0" Name="DataGridVersion" RowHeaderWidth="0" 
                CanUserAddRows="False" AutoGenerateColumns="False" ItemsSource="{Binding Path=versions}" 
                CanUserDeleteRows="False" Margin="25.2,82,22,19" IsReadOnly="True">
          <DataGrid.Columns>
              <DataGridTextColumn Header = "Version" Binding = "{Binding versionName }" Width="0.35*" IsReadOnly="True"/>
              <DataGridTemplateColumn Header="Revisions" Width=" 0.2*" IsReadOnly="True">
                  <DataGridTemplateColumn.CellTemplate>
                      <DataTemplate>
                          <ItemsControl ItemsSource="{Binding Revisions}">
                              <ItemsControl.ItemTemplate>
                                  <DataTemplate>
                                      <StackPanel Orientation="Horizontal">
                                          <TextBlock Text="{Binding revNumber}" />
                                          <TextBlock Text="{Binding Comment}" />
                                      </StackPanel>
                                  </DataTemplate>
                              </ItemsControl.ItemTemplate>
                          </ItemsControl>
                      </DataTemplate>
                  </DataGridTemplateColumn.CellTemplate>
              </DataGridTemplateColumn>
          </DataGrid.Columns>
      </DataGrid>
      

      如果你想在你的DataGrid 中有一个实际的修订和评论列,你应该绑定到一个ObservableCollection&lt;T&gt;,其中T 类型包含三个属性; versionName、revNumber 和 Comment。然后您必须转换您的数据:

      var transformed = versions
          .SelectMany(x => x.Revisions.Select(y => new { x.versionName, y.revNumber, y.Comment }))
          .ToArray();
      

      【讨论】:

      • 感谢您的回复,但我的要求不同。您的解决方案部分解决了我的问题,但我希望每个修订号都是可选的。使用您的解决方案,我可以在网格中填充数据,但无法选择单个修订号。另外,如果您可以使用 ListView 为我提供解决方案,那将非常有帮助。刚才我意识到与数据网格相比,Listview 看起来相当不错
      • 刚刚才意识到最后一行。我的错!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 2013-04-15
      • 2021-02-16
      • 2011-02-24
      • 1970-01-01
      • 2011-04-07
      相关资源
      最近更新 更多