C# Listview仅显示XML中的一条记录
好的。第一次来这里,我有一个非常基本的问题 我在这里存储了一个外部XML。比如说桌面 XML如下所示:C# Listview仅显示XML中的一条记录,c#,xml,wpf,listview,data-binding,C#,Xml,Wpf,Listview,Data Binding,好的。第一次来这里,我有一个非常基本的问题 我在这里存储了一个外部XML。比如说桌面 XML如下所示: <?xml version="1.0" encoding="UTF-8"?> -<Incidents> <Incident> <IncidentNumber>4</IncidentNumber> <Summary>4</Summary>
<?xml version="1.0" encoding="UTF-8"?>
-<Incidents>
<Incident>
<IncidentNumber>4</IncidentNumber>
<Summary>4</Summary>
<Reason1>4</Reason1>
<Reason2>4</Reason2>
<Reason3>4</Reason3>
</Incident>
</Incidents>
-
4.
4.
4.
4.
4.
它有比这更多的“事件”,但我想缩短它
在XAML中,我试图在ListView上显示这些数据,如下所示:
<ListView x:Name="lst_data" Height="290" Margin="10,29,10,0" VerticalAlignment="Top" Width="484" BorderThickness="1" BorderBrush="#FFDADADA" HorizontalAlignment="Center" ItemsSource="{Binding Source={StaticResource IncidentProvider}}">
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding XPath=//Incident/IncidentNumber}" Header="Number"/>
<GridViewColumn DisplayMemberBinding="{Binding XPath=//Incident/Summary}" Header="Summary"/>
<GridViewColumn DisplayMemberBinding="{Binding XPath=//Incident/Reason1}" Header="Reason 1"/>
<GridViewColumn DisplayMemberBinding="{Binding XPath=//Incident/Reason2}" Header="Reason 2"/>
<GridViewColumn DisplayMemberBinding="{Binding XPath=//Incident/Reason3}" Header="Reason 3"/>
</GridView>
</ListView.View>
</ListView>
在某种程度上,这是可行的,但只带来并显示第一条记录,而不显示其余的记录。我尝试了在这个网站上找到的其他东西(比如将XML放入项目目录或在网格Listview中使用DataContext),但都没有成功
我做错了什么或错过了什么
感谢您,也很抱歉花您的时间问了这么一个基本的问题。如果您使用普通绑定,Path is应该绑定到DataContext对象的属性,该对象应该是一个属性,所以请尝试{Binding Name}以下是我尝试的下一步: MainWindows.xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
xmlns:vm="clr-namespace:WpfApplication1"
xmlns:model="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="1200">
<Window.Resources>
<DataTemplate x:Key="IncidentTemplate" DataType="model:IncidentsIncident">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding IncidentNumber}"/>
<TextBlock Text="{Binding Summary}"/>
<TextBlock Text="{Binding Reason1}"/>
<TextBlock Text="{Binding Reason2}"/>
<TextBlock Text="{Binding Reason3}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<DataGrid x:Name="lst_data" AutoGenerateColumns="False" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ItemTemplate="{StaticResource IncidentTemplate}">
<DataGrid.Columns>
<DataGridTextColumn Header="Number" Binding="{Binding IncidentNumber}" Width="*"/>
<DataGridTextColumn Header="Summary" Binding="{Binding Summary}" Width="*"/>
<DataGridTextColumn Header="Reason 1" Binding="{Binding Reason1}" Width="*"/>
<DataGridTextColumn Header="Reason 2" Binding="{Binding Reason2}" Width="*"/>
<DataGridTextColumn Header="Reason 3" Binding="{Binding Reason3}" Width="*"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
MainWindows.xaml.cs
using System.Windows;
using System.Xml;
using System.Linq;
using System.Collections.Generic;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public List<IncidentsIncident> ItemCollection { get; set; }
public MainWindow()
{
InitializeComponent();
XmlDocument doc = new XmlDocument();
doc.Load("..\\..\\Incidents.xml");
ItemCollection = new List<IncidentsIncident>();
foreach (XmlElement item in doc.ChildNodes.OfType<XmlElement>().FirstOrDefault().ChildNodes)
{
ItemCollection.Add(new IncidentsIncident()
{
IncidentNumber = byte.Parse(item.ChildNodes[0].InnerText),
Summary = byte.Parse(item.ChildNodes[1].InnerText),
Reason1 = byte.Parse(item.ChildNodes[2].InnerText),
Reason2 = byte.Parse(item.ChildNodes[3].InnerText),
Reason3 = byte.Parse(item.ChildNodes[4].InnerText)
});
}
lst_data.ItemsSource = ItemCollection;
}
}
}
使用System.Windows;
使用System.Xml;
使用System.Linq;
使用System.Collections.Generic;
命名空间WpfApplication1
{
///
///MainWindow.xaml的交互逻辑
///
公共部分类主窗口:窗口
{
公共列表项集合{get;set;}
公共主窗口()
{
初始化组件();
XmlDocument doc=新的XmlDocument();
doc.Load(“..\\..\\incents.xml”);
ItemCollection=新列表();
foreach(doc.ChildNodes.OfType().FirstOrDefault().ChildNodes中的XmlElement项)
{
ItemCollection.Add(newincidensincident())
{
IncidentNumber=byte.Parse(item.ChildNodes[0].InnerText),
Summary=byte.Parse(item.ChildNodes[1].InnerText),
Reason1=byte.Parse(item.ChildNodes[2].InnerText),
Reason2=byte.Parse(item.ChildNodes[3].InnerText),
Reason3=byte.Parse(item.ChildNodes[4].InnerText)
});
}
lst_data.itemsource=ItemCollection;
}
}
}
模型:
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class IncidentsIncident
{
private byte incidentNumberField;
private byte summaryField;
private byte reason1Field;
private byte reason2Field;
private byte reason3Field;
/// <remarks/>
public byte IncidentNumber
{
get
{
return this.incidentNumberField;
}
set
{
this.incidentNumberField = value;
}
}
/// <remarks/>
public byte Summary
{
get
{
return this.summaryField;
}
set
{
this.summaryField = value;
}
}
/// <remarks/>
public byte Reason1
{
get
{
return this.reason1Field;
}
set
{
this.reason1Field = value;
}
}
/// <remarks/>
public byte Reason2
{
get
{
return this.reason2Field;
}
set
{
this.reason2Field = value;
}
}
/// <remarks/>
public byte Reason3
{
get
{
return this.reason3Field;
}
set
{
this.reason3Field = value;
}
}
}
//
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
公共部分类意外事件
{
私有字节incidentNumberField;
专用字节总和字段;
专用字节推理1字段;
专用字节推理2字段;
专用字节字段;
///
公共字节意外数
{
得到
{
返回此.incidentNumberField;
}
设置
{
this.incidentNumberField=值;
}
}
///
公共字节摘要
{
得到
{
返回此.summaryField;
}
设置
{
this.summaryField=值;
}
}
///
公共字节1
{
得到
{
返回此.reason1Field;
}
设置
{
this.reason1Field=值;
}
}
///
公共字节推理2
{
得到
{
返回此.reason2字段;
}
设置
{
this.reason2Field=值;
}
}
///
公共字节推理3
{
得到
{
返回此.reason3字段;
}
设置
{
this.reason3字段=值;
}
}
}
请给出一个完整的工作示例,这样我们就可以看到问题。这只适用于数据总数。例如,我有4个XML中数字为1,2,3,4的“事件”。每个事件在其自身中都有相同的数据。事件编号1的摘要值为1,原因1的值为1,以此类推。现在,listview正确地获得4条记录,但所有行都显示为“1”。您可以在原始帖子中看到它作为编辑。@Eldgrimr Ive更新了答案。它并不是在xaml中完成所有工作,而是在代码隐藏(或查看模式)中完成所有工作。我
已经测试过了,效果很好。你好,超人。谢谢你的时间和努力。这很有效。我会绕着这个玩一会儿。祝你今天愉快@我很乐意帮忙