2016-04-07 31 views
0

创建UWP窗口10应用程序,该应用程序具有由漫游应用程序数据中的xml文件填充的列表视图。用于删除部分xml文件的UWP列表选择器

现在我想编辑该XML文件,以及在单击列表项目时在视图中。我想我会得到,直到我删除它,但然后我不知道如何将它保存回来。

以前在Silverlight应用程序中,我利用了“流”。

var tmp1 = (Country)PhrasesList.SelectedItem; 
      var tmp2 = tmp1.Name; 

      string phrasesXMLPath = Path.Combine(Windows.Storage.ApplicationData.Current.RoamingFolder.Path + "/quickphrases.xml"); 

      XDocument doc2 = XDocument.Load(phrasesXMLPath); 


      // Retrieve and remove the certain "Mapping" element with its descendants 
      var deleted = doc2.Root.Descendants("item").Single(d => d.Element("name").Value == tmp2); 
      deleted.Remove(); 

回答

0

在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; } 
} 

我想,也许你已经完成了所有工作以上,然后我删除项目通过ListViewSelectionChanged 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”。