在 UWP 应用中,您可以使用 XmlDocument class 检索和创建所有 XML 对象。
我假设您的列表显示 XML 文件中的子节点(XMLElement),而不是一个节点(XMLText)中的文本,然后例如您可以在 XML 中创建节点列表并将此文件保存到应用程序的漫游中像这样的文件:
private async void Create_File(object sender, RoutedEventArgs e)
{
XmlDocument xdoc = new XmlDocument();
XmlElement root = xdoc.CreateElement("List");
xdoc.AppendChild(root);
for (int i = 0; i < 100; i++)
{
XmlElement item = xdoc.CreateElement("item" + i);
root.AppendChild(item);
}
XmlElement books = xdoc.CreateElement("Books");
StorageFolder roamingFolder = Windows.Storage.ApplicationData.Current.RoamingFolder;
StorageFile xmlFile = await roamingFolder.CreateFileAsync("XMLList.xml", CreationCollisionOption.ReplaceExisting);
await xdoc.SaveToFileAsync(xmlFile);
}
这段代码在XML文件中创建了一个“根”,在这个“根”中有100个节点,每个节点命名为"Item" + i;
然后我们需要像这样将这些项目读入ListView:
private ObservableCollection<MyList> mylist = new ObservableCollection<MyList>();
private async void Read_Data_Root(object sender, RoutedEventArgs e)
{
StorageFolder roamingFolder = Windows.Storage.ApplicationData.Current.RoamingFolder;
StorageFile xmlFile = await roamingFolder.GetFileAsync("XMLList.xml");
XmlDocument xdoc = await XmlDocument.LoadFromFileAsync(xmlFile);
txt.Text = xdoc.GetXml(); //show the XML representation of the node and all its descendants in a textblock.
XmlElement root = xdoc.DocumentElement;
mylist.Clear();
foreach (var item in root.ChildNodes)
{
mylist.Add(new MyList { xmlitem = item.GetXml() });
} //show all items in a listview
}
MyList 的类就这么简单:
public class MyList
{
public string xmlitem { get; set; }
}
我想也许你已经完成了以上所有工作,那么我通过ListView的SelectionChanged event删除项目并确认删除Flyout中的项目,这是我的ListView:
<ListView x:Name="listView" Grid.Row="0" SelectionChanged="Show_Delete_Button" ItemsSource="{x:Bind mylist}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding xmlitem}" />
</DataTemplate>
</ListView.ItemTemplate>
<FlyoutBase.AttachedFlyout>
<Flyout>
<Button Content="Delete this item" Click="Delete_Data" />
</Flyout>
</FlyoutBase.AttachedFlyout>
</ListView>
以及删除数据的代码:
private int selectedindex;
private void Show_Delete_Button(object sender, SelectionChangedEventArgs e)
{
FlyoutBase.ShowAttachedFlyout(sender as ListView);
selectedindex = listView.SelectedIndex;
}
private async void Delete_Data(object sender, RoutedEventArgs e)
{
var item = mylist.ElementAt(selectedindex);
mylist.RemoveAt(selectedindex); //remove from listview
StorageFolder roamingFolder = Windows.Storage.ApplicationData.Current.RoamingFolder;
StorageFile xmlFile = await roamingFolder.GetFileAsync("XMLList.xml");
XmlDocument xdoc = await XmlDocument.LoadFromFileAsync(xmlFile);
XmlElement root = xdoc.DocumentElement;
string itemstring = item.xmlitem.TrimStart('<');
itemstring = itemstring.TrimEnd('>', '/');
root.RemoveChild(root.GetElementsByTagName(itemstring).FirstOrDefault()); //remove from root element.
await xdoc.SaveToFileAsync(xmlFile); //save the new list
}
这是从 XML 文件中删除节点列表的代码。如果您以不同的方式在 XML 文件中创建列表并构建,请发布您的代码。顺便说一句,这里我们使用命名空间“Windows.Data.Xml.Dom”,而不是命名空间“System.Xml”。