使用列表将datagrid WPF绑定到两个不同的类?

时间:2014-03-25 09:13:03

标签: c# wpf list binding datagrid

当然,我已经在网络上的所有地方进行了搜索,但我无法找到解决问题的方法。

我的问题

我有患者类,其中包含一些听力图(Audiogramm Class)。 实际上,我可以在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;
<DataGrid x:Name="dataGrid_XML" AutoGenerateColumns="false" ItemsSource="{Binding Patient}">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding patientID}"  Header="ID Patient"/>
        <DataGridTextColumn Binding="{Binding genre}"  Header="Genre"/>               
        <DataGridTextColumn Binding="{Binding createDate}"  Header="Date création"/>
        <DataGridTextColumn Binding="{Binding audiogram.typeData}"  Header="Type de données"/>
        <DataGridTextColumn Binding="{Binding audiogram.actionData}"  Header="Date de dernière action"/>
    </DataGrid.Columns>
</DataGrid>

3 个答案:

答案 0 :(得分:0)

你应该使用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>

答案 1 :(得分:0)

为什么要将itemssource设置两次? dataGrid_XML.ItemsSource = listPatient;和ItemsSource =“{绑定患者}”?并且您的xaml不起作用,因为List没有属性typeData。 :)你的项目在你的列表中有这个属性。

所以,如果您想绑定您的听力图集合,您需要某种物品控制。如果你想在一个数据网格中执行所有操作,请查看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>

答案 2 :(得分:0)

我找到了一个有效的解决方案,你让我想到了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>