【问题标题】:Binding datagrid WPF to two different classes with lists?将datagrid WPF绑定到带有列表的两个不同类?
【发布时间】: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;

【问题讨论】:

    标签: c# wpf list binding datagrid


    【解决方案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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-05
        • 1970-01-01
        • 2021-04-11
        • 2015-06-08
        • 1970-01-01
        • 2010-12-16
        • 2021-03-18
        相关资源
        最近更新 更多