【问题标题】:Populate Observable collection from XML file in project (WPF)从项目中的 XML 文件填充 Observable 集合(WPF)
【发布时间】:2018-08-12 11:33:50
【问题描述】:

我的项目中有 XML 文件

这里是

  <?xml version="1.0"?>
<catalog>
   <car id="1">
      <model>Scoda Fabia</model>
      <year>2011</year>
      <producer>Folkwagen</producer>
      <price>6000</price>
      <owner>Bil Johnson</owner>
      <tel>+5810456455456</tel>
      <mileage>670000</mileage>
      <registered>USA</registered>
      <image>Fabia1.JPG</image>
   </car>
   <car id="2">
      <model>Huindai Getz</model>
      <year>2008</year>
      <producer>Huindai</producer>
      <price>5000</price>
      <owner>Dimitrious Gregorakis</owner>
      <tel>+5810456445456</tel>
      <mileage>120000</mileage>
      <registered>USA</registered>
      <image>hyundai_getz2.jpg</image>
   </car>
   <car id="3">
      <model>Huindai i108</model>
      <year>2014</year>
      <producer>Huindai</producer>
      <price>15000</price>
      <owner>Dex Dexter</owner>
      <tel>+5815556445456</tel>
      <mileage>30000</mileage>
      <registered>Canada</registered>
      <image>hyundaii108.jpg</image>
   </car>
   <car id="4">
      <model>Aveo</model>
      <year>2000</year>
      <producer>Shevrole</producer>
      <price>3500</price>
      <owner>Ivan Ivanov</owner>
      <tel>+5815556445477</tel>
      <mileage>300000</mileage>
      <registered>Mexico</registered>
      <image>aveo.jpg</image>
   </car>
</catalog>

我从中创建了一个类,这是类的代码

 [XmlRoot(ElementName = "car")]
public class Car
{
    [XmlElement(ElementName = "model")]
    public string Model { get; set; }
    [XmlElement(ElementName = "year")]
    public string Year { get; set; }
    [XmlElement(ElementName = "producer")]
    public string Producer { get; set; }
    [XmlElement(ElementName = "price")]
    public string Price { get; set; }
    [XmlElement(ElementName = "owner")]
    public string Owner { get; set; }
    [XmlElement(ElementName = "tel")]
    public string Tel { get; set; }
    [XmlElement(ElementName = "mileage")]
    public string Mileage { get; set; }
    [XmlElement(ElementName = "registered")]
    public string Registered { get; set; }
    [XmlElement(ElementName = "image")]
    public string Image { get; set; }
    [XmlAttribute(AttributeName = "id")]
    public string Id { get; set; }
}

[XmlRoot(ElementName = "catalog")]
public class Catalog
{
    [XmlElement(ElementName = "car")]
    public List<Car> Car { get; set; }
}

并为它创建了 ViewModel,我在其中定义了 observable 集合并定义了一个方法来用 XML 中的数据填充它

public class CarViewModel
{
    public ObservableCollection<List<Car>> car { get; set; }
    public void LoadCars()
    {
        Car = new ObservableCollection<List<Car>>();

        var path = @"xml\CarsDatabase.xml";
        using (TextReader reader = new StreamReader(path))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Catalog));
            return (Catalog)serializer.Deserialize(reader);
        }
    }
}

在方法 LoadCars 中,我需要用我的文件中的数据填充汽车可观察集合,该文件位于项目内部。

我怎样才能正确地做到这一点? 谢谢你的帮助。

更新

我尝试使用这种方法

public void LoadCars()
    {
        Car = new ObservableCollection<List<Car>>();

        var path = @"xml\CarsDatabase.xml";
        using (TextReader reader = new StreamReader(path))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Catalog));
            return (Catalog)serializer.Deserialize(reader);
        }
    }

但现在我有错误

严重性代码描述项目文件行抑制状态 错误 CS0127 由于 'CarViewModel.LoadCars()' 返回 void,返回关键字后面不能跟对象表达式 DaxxTest C:\Users\nemes\Source\Repos\daxx_test\DaxxTest\DaxxTest\ViewModels\CarViewModel.cs 25 Active

【问题讨论】:

  • 我更新了有问题的代码,添加了加载 XML File@mjwills
  • 您的意思是ObservableCollection&lt;List&lt;Car&gt;&gt;,而不是List&lt;Car&gt;ObservableCollection&lt;Car&gt;
  • 我编辑了这个public ObservableCollection&lt;Car&gt; Car { get; set; }当然@fuglede
  • 嗨,“Car = new ObservableCollection>();”:应该是“car”并将 ObservableCollection> 更改为 ObservableCollection。同时。 P / S:您可以复制粘贴我的答案以检查它。加油!

标签: c# .net wpf observablecollection


【解决方案1】:

改变

public ObservableCollection<List<Car>> car { get; set; } 

public ObservableCollection<Car> car { get; set; }

并使用 XmlSerializer 序列化您的 xml 信息。查看下面的代码示例:

        public ObservableCollection<Car> cars { get; set; }

        public void LoadCars()
        {

            XmlSerializer serializer = new XmlSerializer(typeof(Catalog));

            StreamReader reader = new StreamReader("CarsDatabase.xml");
            var catalog = (Catalog)serializer.Deserialize(reader);
            cars = new ObservableCollection<Car>(catalog.Car);
            reader.Close();
        }

        [Serializable()]
        public class Car
        {
            [XmlElement(ElementName = "model")]
            public string Model { get; set; }
            [XmlElement(ElementName = "year")]
            public string Year { get; set; }
            [XmlElement(ElementName = "producer")]
            public string Producer { get; set; }
            [XmlElement(ElementName = "price")]
            public string Price { get; set; }
            [XmlElement(ElementName = "owner")]
            public string Owner { get; set; }
            [XmlElement(ElementName = "tel")]
            public string Tel { get; set; }
            [XmlElement(ElementName = "mileage")]
            public string Mileage { get; set; }
            [XmlElement(ElementName = "registered")]
            public string Registered { get; set; }
            [XmlElement(ElementName = "image")]
            public string Image { get; set; }
            [XmlAttribute(AttributeName = "id")]
            public string Id { get; set; }
        }

        [Serializable()]
        [XmlRootAttribute("catalog", Namespace = "", IsNullable = false)]
        public class Catalog
        {
            [XmlElement(ElementName = "car")]
            public List<Car> Car { get; set; }
        }

【讨论】:

  • 好的,不过我也有Catalog,可能需要用吗?
  • 您已经使用它来序列化您的汽车列表。如果您需要在某个地方使用您的目录,您可以定义其他属性/变量。
  • 是的,但是当我尝试在这样的主类中运行代码时 var carViewModel = new CarViewModel(); carViewModel.LoadCars(); DataContext = carViewModel; 数据上下文为空。
  • 有趣!你能分享你的主类和xaml吗?我从我这边尝试过: public partial class MainWindow : Window { public MainWindow() { var carViewModel = new CarViewModel(); carViewModel.LoadCars(); this.DataContext = carViewModel; } } 而且效果很好
  • 我的问题是系统找不到文件
猜你喜欢
  • 2014-01-05
  • 2014-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多