将datagrid WPF绑定到带有列表的两个不同类?
Posted
技术标签:
【中文标题】将datagrid WPF绑定到带有列表的两个不同类?【英文标题】:Binding datagrid WPF to two different classes with lists? 【发布时间】:2014-05-03 00:29:34 【问题描述】:当然,我在网上到处搜索,但找不到解决问题的方法。
我的问题
我有一个包含听力图列表(Audiogramm 类)的患者类。 实际上,我可以在 DataGrid 中显示患者列表。但我想在 DataGrid (WPF) 中显示每位患者的听力图。
class Patient
public Patient(string patientid, string genre, string createdate)
this.patientID = patientid;
this.genre = genre;
this.createDate = createdate;
audiogram = new List<Audiogram>();
public string patientID get; set;
public string genre get; set;
public string createDate get; set;
public List<Audiogram> audiogram get; set;
class Audiogram
public Audiogram(string typeData, string actionDate)
this.typeData = typeData;
this.actionData = actionData;
public string typeData get; set;
public string actionData get; set;
XmlNodeList nodeList = root.SelectNodes("/pt:NOAH_Patients_Export/pt:Patient/pt:Patient", nsmgr);
foreach (XmlNode node in nodeList)
XmlNodeList nodeListAudio = node.SelectNodes("//pt:Actions", nsmgr);
Patient patient = new Patient(node["pt:NOAHPatientId"].InnerText, node["pt:Gender"].InnerText, node["pt:CreateDate"].InnerText);
foreach (XmlNode nodeAudio in nodeListAudio)
Audiogram audiogramme = new Audiogram(nodeAudio["pt:TypeOfData"].InnerText, nodeAudio["pt:ActionDate"].InnerText);
patient.audiogram.Add(audiogramme);
listPatient.Add(patient);
dataGrid_XML.ItemsSource = listPatient;
【问题讨论】:
【参考方案1】:您应该使用 RowDetails 模板
<DataGrid Name="dgUsers" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="Binding Name" />
<DataGridTextColumn Header="Birthday" Binding="Binding Birthday" />
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<TextBlock Text="Binding audiogram.actionData" Margin="10" />
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
【讨论】:
感谢您的帮助,此解决方案对我有用,但我想避免使用 RowDetailsTemplate。我用 datagrid.items.add() 找到了一个可行的解决方案,我会尽可能发布我的解决方案。【参考方案2】:为什么你设置你的 itemssource 两次? dataGrid_XML.ItemsSource = listPatient;和 ItemsSource="Binding Patient"?并且您的 xaml 不起作用,因为 List 没有属性 typeData。 :) 它是您列表中具有此属性的项目。
所以如果你想绑定你的听力图集合,你需要某种 itemscontrol。如果您想在一个数据网格中完成所有操作,请查看 RowDetailsTemplate。
如果你想要你的主网格和第二个列表,例如你选择的行,试试
<DataGrid AutoGenerateColumns="false" ItemsSource="Binding ElementName=dataGrid_XML, Path=SelectedItem.audiogram">
<DataGrid.Columns>
<DataGridTextColumn Binding="Binding typeData" Header="Type de données"/>
<DataGridTextColumn Binding="Binding actionData" Header="Date de dernière action"/>
</DataGrid.Columns>
</DataGrid>
【讨论】:
【参考方案3】:我找到了一个可行的解决方案,你让我想到了 datagrid.items.add()
我有一个问题,如何删除 typeData 和 actionData 列的空单元格(第一个单元格)?
C#
foreach (XmlNode node in nodeList)
XmlNodeList nodeListAudio = node.SelectNodes("//pt:Actions", nsmgr);
Patient patient = new Patient(node["pt:NOAHPatientId"].InnerText, node["pt:Gender"].InnerText, node["pt:CreateDate"].InnerText);
dataGrid_XML.Items.Add(patient);
foreach (XmlNode nodeAudio in nodeListAudio)
Audiogram audiogramme = new Audiogram(nodeAudio["pt:TypeOfData"].InnerText, nodeAudio["pt:ActionDate"].InnerText);
dataGrid_XML.Items.Add(audiogramme);
XAML
<DataGrid x:Name="dataGrid_XML" AutoGenerateColumns="false">
<DataGrid.Columns>
<DataGridTextColumn Binding="Binding patientID" Header="ID Patient" IsReadOnly="True"/>
<DataGridTextColumn Binding="Binding genre" Header="Genre" IsReadOnly="True"/>
<DataGridTextColumn Binding="Binding createDate" Header="Date création" IsReadOnly="True"/>
<DataGridTextColumn Binding="Binding typeData" Header="Type de données" IsReadOnly="True"/>
<DataGridTextColumn Binding="Binding actionData" Header="Date de dernière action" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
【讨论】:
以上是关于将datagrid WPF绑定到带有列表的两个不同类?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 DataGrid 中的文本框绑定到 Wpf 中的列表?
将内部datagrid数据与外部datagrid wpf绑定
WPF DataGrid在同一列中的不同控件 - 不正确的绑定