【问题标题】:Deserialize XML file to ObservableCollection and add object将 XML 文件反序列化为 ObservableCollection 并添加对象
【发布时间】:2023-04-07 13:15:01
【问题描述】:

我已经使用带有此方法的按钮来反序列化 ObservableCollection,但之后我无法再将对象添加到我的列表中。

private async void RecoveryList_Click(object sender, RoutedEventArgs e)
    {
StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync("List.xml"); 
DataContractSerializer serializer = new DataContractSerializer(typeof(ObservableCollection<ProductClass>));

using (Stream stream = await file.OpenStreamForReadAsync())
{
   ObservableCollection<ProductClass> Products = serializer.ReadObject(stream) as ObservableCollection<ProductClass>;
   ListView1.ItemsSource = Products;
}
   }

并进行序列化

private async void ButtonSave_Click(object sender, RoutedEventArgs e)
    {
DataContractSerializer serializer = new DataContractSerializer(typeof(ObservableCollection<ProductClass>)); 
StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync("List.xml", CreationCollisionOption.ReplaceExisting); 

using (Stream stream = await file.OpenStreamForWriteAsync()) 
{
   serializer.WriteObject(stream, Products); 
   ListView1.ItemsSource = Products;
}
    }

添加我用过的产品

private async void ButtonAdd_Click(object sender, RoutedEventArgs e)
  {
        Products.Add(new ProductClass{ Prodotti = TexBoxInputProducts.Text });           
  }

我的 ObservableCollection 是

public ObservableCollection<ProductClass> Products;

我的课是

namespace AppSpesaPhone.Models
{
   public class ProductClass
   {
        public string Prodotti { get; set; }
   }       
}

如何将一些“产品”添加到我的列表中?

【问题讨论】:

  • 您遇到了什么异常?
  • 当用户插入一个产品时,这个替换整个反序列化列表
  • 我有一个文本框,用户在其中插入产品,单击添加按钮后,产品进入列表。所以,当用户关闭我想要的应用程序时,当他回来时,点击“恢复列表”后,应用程序会给他他的旧列表。现在用户可以添加产品,但如果列表被反序列化,新产品将替换旧的反序列化列表。
  • 什么都没有改变,当我添加一个产品什么都没有出现,只有反序列化的列表。

标签: c# xml deserialization win-universal-app xml-deserialization


【解决方案1】:

您的类中有一个名为Products 的公共ObservableCollection&lt;ProductClass&gt; 字段,但在您的RecoveryList_Click 方法中,您使用一个新的ObservableCollection 也名为Products 来检索反序列化列表并将其设置为ListView 的@ 987654326@。它们虽然同名,但并不是同一个对象。所以你不能向 ListView 添加新项目。

要解决此问题,您可以删除 RecoveryList_Click 方法中的新 Products 声明,如下所示,并确保在所有方法中,您都在操作同一个对象。

private async void RecoveryList_Click(object sender, RoutedEventArgs e)
{
    StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync("List.xml");
    DataContractSerializer serializer = new DataContractSerializer(typeof(ObservableCollection<ProductClass>));

    using (Stream stream = await file.OpenStreamForReadAsync())
    {
        Products = serializer.ReadObject(stream) as ObservableCollection<ProductClass>;
        ListView1.ItemsSource = Products;
    }
}

【讨论】:

  • 非常感谢!成就了我的一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多