一般从XML文件填充ObservableCollection

时间:2016-04-07 20:38:05

标签: c# xml

在创建一个从ObservableCollection文件中一般添加到XML的方法时,每个记录都是最后一个记录。

我需要将多个XML文件加载到多个ObservableCollection中。这很简单,但这些ObservableCollection基于多个Classes以及更多内容会被添加,更不用说对现有Classes的更改必须反映在阅读XML个文件。所以我认为有一个返回泛型ObservableCollection<object>的方法可以解决这个问题。当调用该方法时,Class的{​​{1}}会抛出类似的内容;

ObservableCollection

然后在每个XElement的方法中,我将每个属性设置为这样;

MyClass c = new MyClass();
GetXMLData(c);

这种作品但确实存在问题。由于我在数据上投放数据,每个记录tableData都是最后读取的记录

说XML数据如下所示:

public ObservableCollection<object> GetXMLData(object value)
{
    string fName = "MyPath";
    ObservableCollection<object> tableData = new ObservableCollection<object>();
    FileStream fs = new FileStream(fName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    {
        XDocument fileXML = XDocument.Load(fs);
        var dataXML =
            from x in fileXML.Descendants("MyData")
            select x;
        foreach (XElement x in dataXML)
        {
            var data = (object)value;
            foreach (var prop in value.GetType().GetProperties())
            {
                    PropertyInfo propertyInfo = data.GetType().GetProperty(prop.Name);
                    propertyInfo.SetValue(data, Convert.ChangeType(x.Attribute(prop.Name).Value, propertyInfo.PropertyType), null);
            }
            tableData.Add(data);
        }
    }
    return tableData;
}

如果你看<Item Field1="Bob" Field2="10" /> <Item Field1="Mike" Field2="20" /> <Item Field1="Sam" Field2="30" /> ,你会看到:

ObservableCollection<object>

而不是看到这个:

Field1="Sam", Field2="30"
Field1="Sam", Field2="30"
Field1="Sam", Field2="30"

注意:

  1. 我确实有错误处理不存在的错误数据的逻辑。所以忽略那个
  2. 您可以放心地假设XML文件的属性与Class
  3. 完全匹配

    编辑:试图澄清我的问题。对不起想要展示我不仅仅是“嘿你是怎么做到的?”

1 个答案:

答案 0 :(得分:1)

嗯......循环中data的所有实例实际上都是对value的引用。他们不是&#34;新&#34;对象。所以,你在每个循环中所做的是改变value的属性,我确定这不是你想要的。如果你Debug.WriteLine(value),在每次迭代中,你都会看到我的意思。因此,所有三个data实例和value将始终相同。如果您知道value的类型,则应创建实例,并相应地设置它的属性。假设您的类型具有非参数公共构造函数:

var data = Activator.CreateInstance( value.GetType() );

...会让你开始。