将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:将列表动态绑定到(某些)对象的属性

WPF DataGrid在同一列中的不同控件 - 不正确的绑定

如何将 List<CustomObject> 绑定到 WPF DataGrid?

如何用多个选定的文件名填充WPF DataGrid以进行编辑?