有一个结构简单的 XML:
<Employee>
<people>
<Name>Василий</Name>
<LastName>Петрович</LastName>
</people>
</Employee>
等等十几个条目。
上面有一个 WPF 窗体ListBox
。加载表单时ListBox
,员工的姓名取自<Name>
. 你如何实现如果你ListBox
点击名字,然后,比如说,Label
他的姓氏将显示在下一个中的任务?
//Загрузка элементов Name и помещение их в ListBox
XElement xElements = XElement.Load(@"Employee.xml");
foreach (XElement xEle in xElements.Descendants("Name"))
{
Listbox_Employee.Items.Add((string)xEle);
}
是的,目前,这项任务对我来说正好一半。也就是说,如果我启动程序,添加新用户,然后ListBox
选择一个新名称,那么他们的姓氏就会显示出来。但是,它会在程序重新启动之前准确显示,因为这些值在运行时存储在 RAM 中。因此,如果在启动程序后添加新名称,则在单击它们后会显示这些名称,但如果我单击上次添加的名称,则什么也不会发生。
我理解理论上,在单击对象后ListBox
,应该执行一个方法来打开 XML,执行Container.Descendant
s 方法并关联这个ListBox
特定的姓氏指的是这个对象。
谢谢你的帮助,爱人。
顺便说一下,我正在使用 XElement。
补充1:
在Bulson的推荐下解决问题,我遇到了另一个问题。我创建了一个更简单的 XML 结构:
<MainData>
<Name>Василий</Name>
<LastName>Петрович</LastName>
</MainData>
使用 TextBox 和 ListBox 创建了一个简单的 WPF 窗体。接下来,按照建议,我创建了一个单独的类:
[Serializable, XmlRoot("MainData")]
public class DataExctract
{
[XmlAttribute("LastName")]
public string LastName { get; set; }
}
接下来,在表格上:
public MainWindow()
{
InitializeComponent();
LoadXml(); //Выполняем метод при загрузке окна
}
//Этот метод загружает XML и помещает дочерний элемент Name в ListBox
public void LoadXml()
{
try
{
XElement xElements = XElement.Load(@"DataXML.xml");
foreach (XElement xEle in xElements.Descendants("Name"))
{
listBox.Items.Add((string)xEle);
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
//При двойном щелчке по любому элементу помещаем фамилию в TextBox
private void listBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
try
{
StreamReader reader = new StreamReader(@"DataXML.xml");
XmlSerializer serializer = new XmlSerializer(typeof(List<DataExctract>));
DataExctract DE = (DataExctract)serializer.Deserialize(reader);
textBox.Text = DE.LastName;
reader.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
结果,我得到一个例外:
There is an error in XML document (1, 2)
当我双击名称时会出现此错误。我在English Stack中找到了2个类似的问题,但我无法理解罪魁祸首(缺乏英语知识)。
Person
具有全名属性的类。Repository
,其中包含用于写入/读取 xml 文件的方法。List<Person> People
并将其指定为ListBox.ItemsSource
.public Person SelectedPerson { get; set; }
并将该属性绑定到ListBox.SelectedItem
,然后当您在列表中选择时,该属性将发生变化,您可以从中提取姓氏并显示在 上Label
。这个描述是笼统的,还有很多细微差别。