【问题标题】:Binding datagrid to two different classes with lists?使用列表将数据网格绑定到两个不同的类?
【发布时间】:2013-11-03 14:24:42
【问题描述】:

这是我在 StackOverflow 上的第一个问题,所以我希望我没有做错任何事! 对不起,如果是这样!我需要一些帮助,因为我找不到我的问题的解决方案。当然,我在网上到处搜索,但找不到它(由于声誉低,无法发布我正在使用的链接:()。此外,我是 C# 和 WPF 的新手(以及自学)。我以前在 C++/Qt 中工作,所以我不知道 WPF 中的一切是如何工作的。对不起我的英语,我是法语。

我的问题

我的基本课程是员工可以使用计算机。计算机的 id 和使用日期存储在类Connection 中。我想在 DataGrid 和 RowDetailsTemplate 中显示列表信息,如下所示:

所以它会绑定到 Employee 类,但也绑定到 Connection 类,只有属性的最后一个值(这里是列表“计算机 ID”的最后一个值和列表的最后一个值最后一台计算机上的“连接日期”)。所以它是不同列表中的一个循环。我该怎么做?

做的太多了吗? :( 我成功获取了员工信息,但我不知道如何绑定计算机列表。当我尝试时,它会显示“(集合)”,因此它不会进入列表:(

问题摘要

  1. 如何在DataGrid 中显示/绑定列表和不同类中的值?
  2. 如何将列表的所有值显示到RowDetailsTemplate 中?

在 Windows 7 和 Visual Studio 2010 Pro 版本下。

【问题讨论】:

  • 在我的示例中,我的设计可能存在问题。事实上,这不是我使用的真实设计。这是一个假的例子,因为我正在从事一个机密项目。对于那个很抱歉。我应该多考虑一下:/
  • 随意编辑您的问题以使其更清晰(我会相应地编辑我的答案)。
  • @MyRestlessDream 没有理由在您的问题中包含解决方案,这就是您将答案标记为已接受的原因。

标签: c# wpf data-binding datagrid rowdetailstemplate


【解决方案1】:

如果您还没有熟悉 MVVM 模式,我建议您熟悉一下...这是非常基本的,因此您需要对其进行修改/样式化以获得您想要的 ^_^...

    <DataGrid ItemsSource="{Binding Employees}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}"/>
            <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}"/>
            <DataGridTextColumn Header="Gender" Binding="{Binding Gender}"/>
            <DataGridTextColumn Header="Last computer used" Binding="{Binding LastComputerUsed}"/>
            <DataGridTextColumn Header="Last connection date" Binding="{Binding LastConnectionDate}"/>
        </DataGrid.Columns>
        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                <DataGrid ItemsSource="{Binding ComputerIDs}">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Computer ID" Binding="{Binding ID}"/>
                        <DataGridTemplateColumn>
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <ListView ItemsSource="{Binding ConnectionDates}"/>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                    </DataGrid.Columns>
                </DataGrid>
            </DataTemplate>
        </DataGrid.RowDetailsTemplate>
    </DataGrid>

【讨论】:

  • 这假定Employee 有一个ComputerIDs 的列表,另一方面,如果Connections 是列表,那么每个Connection 将只有一个ComputerID,或者它看起来不像您发布的图像:P ...在这种情况下,绑定将是ItemsSource="{Binding Path="Connection.ComputerID"}"。此外,这假设您使用 LastComputerUsedLastConnectionDate 的 getter 来获取适当的值。如果您有任何其他问题,请随时发表评论(毕竟它看起来并不像您的图像,尽管它可以^_^)...
  • ItemsSource="{Binding Path="Connections"}", &lt;DataGridTextColumn Header="Computer ID" Binding="{Binding ComputerID.ID}"/&gt;, ` `,对不起...
  • 非常感谢!我几乎成功地完成了我想做的事情:D 但我还有另一个问题。您知道是否可以添加 Grid/其他布局而不是新的 DataGrid ?我想根据需要组织数据。你觉得有可能吗?
  • 你可以添加任何你喜欢的东西,只要它有ItemsSource(即一种绑定到一个集合并获得每个项目的表示的方法)——任何从ItemsControl派生的东西,并且支持自定义DataTemplate 用于第三个列表嵌套的列(例如GridViewColumn.CellTemplate 用于GridView/ListView),尽管我相信styling it(链接:P)适当地比控制本身的选择更重要。
  • Oki 非常感谢 Stefan!我非常感谢您的帮助/建议/链接。我会尝试更多的东西,我会告诉你:)
【解决方案2】:

让我们试试,

您可以创建一个名为 EmployeeConnection 的类,该类将具有

公共雇员雇员{得到;私人套装; } 公共列表连接{获取;私人套装; }

因此,gridview 中的每一行都将有 1 名员工和具有连接的列。

您必须将 EmployeeConnection 作为您的 gridview 数据源。

可以吗?

【讨论】:

  • 感谢您的回答。这不是我想做的,因为不为此添加新类会很棒:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 2015-08-16
  • 1970-01-01
相关资源
最近更新 更多