使用列表将数据网格绑定到两个不同的类?
Posted
技术标签:
【中文标题】使用列表将数据网格绑定到两个不同的类?【英文标题】:Binding datagrid to two different classes with lists? 【发布时间】:2013-11-03 14:24:42 【问题描述】:这是我在 *** 上的第一个问题,所以我希望我没有做错任何事! 对不起,如果是这样!我需要一些帮助,因为我找不到我的问题的解决方案。当然,我在网上到处搜索,但找不到它(由于声誉低,无法发布我正在使用的链接:()。此外,我是 C# 和 WPF 的新手(以及自学)。我以前在 C++/Qt 中工作,所以我不知道 WPF 中的一切是如何工作的。对不起我的英语,我是法语。
我的问题
我的基本课程是员工可以使用计算机。计算机的 id 和使用日期存储在类Connection
中。我想在 DataGrid 和 RowDetailsTemplate 中显示列表信息,如下所示:
所以它会绑定到 Employee
类,但也绑定到 Connection
类,只有属性的最后一个值(这里是列表“计算机 ID”的最后一个值和列表的最后一个值最后一台计算机上的“连接日期”)。所以它是不同列表中的一个循环。我该怎么做?
做的太多了吗? :( 我成功获取了员工信息,但我不知道如何绑定计算机列表。当我尝试时,它会显示“(集合)”,因此它不会进入列表:(
问题摘要
-
如何在
DataGrid
中显示/绑定列表和不同类中的值?
如何将列表的所有值显示到RowDetailsTemplate
中?
在 Windows 7 和 Visual Studio 2010 Pro 版本下。
【问题讨论】:
在我的示例中,我的设计可能存在问题。事实上,这不是我使用的真实设计。这是一个假的例子,因为我正在从事一个机密项目。对于那个很抱歉。我应该多考虑一下:/ 随意编辑您的问题以使其更清晰(我会相应地编辑我的答案)。 @MyRestlessDream 没有理由在您的问题中包含解决方案,这就是您将答案标记为已接受的原因。 【参考方案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""
。此外,这假设您使用 LastComputerUsed
和 LastConnectionDate
的 getter 来获取适当的值。如果您有任何其他问题,请随时发表评论(毕竟它看起来并不像您的图像,尽管它可以^_^)...
ItemsSource="Binding Path="Connections""
, <DataGridTextColumn Header="Computer ID" Binding="Binding ComputerID.ID"/>
, ` `,对不起...
非常感谢!我几乎成功地完成了我想做的事情:D 但我还有另一个问题。您知道是否可以添加 Grid/其他布局而不是新的 DataGrid ?我想根据需要组织数据。你觉得有可能吗?
你可以添加任何你喜欢的东西,只要它有ItemsSource
(即一种绑定到一个集合并获得每个项目的表示的方法)——任何从ItemsControl
派生的东西,并且支持自定义DataTemplate
用于第三个列表嵌套的列(例如GridViewColumn.CellTemplate
用于GridView
/ListView
),尽管我相信styling it(链接:P)适当地比控制本身的选择更重要。
Oki 非常感谢 Stefan!我非常感谢您的帮助/建议/链接。我会尝试更多的东西,我会告诉你:)【参考方案2】:
让我们试试,
您可以创建一个名为 EmployeeConnection 的类,该类将具有
公共雇员雇员得到;私人套装; 公共列表连接获取;私人套装;
因此,gridview 中的每一行都将有 1 名员工和具有连接的列。
您必须将 EmployeeConnection 作为您的 gridview 数据源。
可以吗?
【讨论】:
感谢您的回答。这不是我想做的,因为不为此添加新类会很棒:/以上是关于使用列表将数据网格绑定到两个不同的类?的主要内容,如果未能解决你的问题,请参考以下文章