C# WPF将数据集保存到xml

C# WPF将数据集保存到xml,c#,xml,wpf,datagrid,dataset,C#,Xml,Wpf,Datagrid,Dataset,我已经尝试将xml文件读取/保存到datagrid,我正在使用dataset来完成这项工作。现在我已经成功地将xml文件数据加载到datagrid,代码如下: public class StoreDbDataSet { internal static DataSet ReadDataSet() { DataSet ds = new DataSet(); ds.ReadXmlSchema("store.xsd"); ds.ReadXm

我已经尝试将xml文件读取/保存到datagrid,我正在使用dataset来完成这项工作。现在我已经成功地将xml文件数据加载到datagrid,代码如下:

public class StoreDbDataSet
{
    internal static DataSet ReadDataSet()
    {
        DataSet ds = new DataSet();
        ds.ReadXmlSchema("store.xsd");
        ds.ReadXml("store.xml");
        return ds;
    }

}
以及:

我的问题是,当我更改datagrid数据时,如何将更改保存到xml?提前感谢

---------------------------更新-------------------------------

    private void RefreshProductList()
    {
        ProductsView = new ListCollectionView(sdb.GetProducts())
        {
            Filter = obj =>
            {
                var Product = (Product)obj;
                return SelectedProduct != null && Product.ModelNumber == SelectedProduct.ModelNumber;
            }
        };
    }

    private Product selectedProduct;
    public Product SelectedProduct
    {

        get { return selectedProduct; }
        set
        {
            if (selectedProduct != value)
            {
                selectedProduct = value;
                NotifyPropertyChanged();
                RefreshProductList();
                RefreshModule();
                RefreshCommunication();
                List<Product> productlist = ProductsView.ToList();
                File.WriteAllText("store.xml", productlist.ToXML());
            }
        }
    }
private void RefreshProductList()
{
ProductsView=新建ListCollectionView(sdb.GetProducts())
{
过滤器=对象=>
{
var产品=(产品)obj;
返回SelectedProduct!=null&&Product.ModelNumber==SelectedProduct.ModelNumber;
}
};
}
私人产品选择产品;
公共产品精选产品
{
获取{返回selectedProduct;}
设置
{
如果(selectedProduct!=值)
{
所选产品=价值;
NotifyPropertyChanged();
RefreshProductList();
刷新模块();
刷新通信();
List productlist=ProductsView.ToList();
writealText(“store.xml”,productlist.ToXML());
}
}
}

问题在于,您将xml作为数据集读取,而不是将其作为产品读取,并将其另存为产品数组,如下所示

您的xml格式应该如下所示

<ArrayOfProduct>
<Product>
<ModelNumber>abc</ModelNumber>
//remaking properties 
</Product>
</ArrayOfProduct>

怎么样?我这样做了,但它只是创建了一个新的空xml文件。您将哪个组件写入xml?如果要将数据绑定到ProductsView,请参见setter方法的更改。如果更改了,则将其写入XML。抱歉,我已更新了正确的代码。当我更改datagrid中的数据时,系统似乎没有在ProductView方法中调用NotifyPropertyChanged。非常感谢您的回复,但我在尝试通过您的代码加载XML数据时出错。
InvalidOperationException:不应出现我的xml文件看起来像:
我已为您提供了xml格式尝试以这种方式保存您的xml我看不出这两个xml文件之间的区别NewDataSet不能是列表,如果您序列化列表,您将获得根标记作为产品的数组我将其完全更改为您的,仍然得到错误:
InvalidOperationException:不应出现
    public ICollectionView ProductsView
    {
        get { return _ProductsView; }
        set
        {
            _ProductsView = value;
            NotifyPropertyChanged();
        }
    }
    private void RefreshProductList()
    {
        ProductsView = new ListCollectionView(sdb.GetProducts())
        {
            Filter = obj =>
            {
                var Product = (Product)obj;
                return SelectedProduct != null && Product.ModelNumber == SelectedProduct.ModelNumber;
            }
        };
    }

    private Product selectedProduct;
    public Product SelectedProduct
    {

        get { return selectedProduct; }
        set
        {
            if (selectedProduct != value)
            {
                selectedProduct = value;
                NotifyPropertyChanged();
                RefreshProductList();
                RefreshModule();
                RefreshCommunication();
                List<Product> productlist = ProductsView.ToList();
                File.WriteAllText("store.xml", productlist.ToXML());
            }
        }
    }
<ArrayOfProduct>
<Product>
<ModelNumber>abc</ModelNumber>
//remaking properties 
</Product>
</ArrayOfProduct>
public static class ExtensionMethods
{
    /// <summary>
    /// Converts given class to XML using xml serialization
    /// </summary>
    /// <typeparam name="T">Type of Class</typeparam>
    /// <param name="classObject">Class to be serialized</param>
    /// <returns>Xml string</returns>
    public static string ToXML<T>(this T classObject) where T : class
    {
        XmlSerializer xmls = new XmlSerializer(typeof(T));
        using (MemoryStream ms = new MemoryStream())
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Encoding = new UTF8Encoding(false);
            settings.Indent = true;
            settings.IndentChars = "\t";
            settings.NewLineChars = Environment.NewLine;
            settings.OmitXmlDeclaration = true;
            settings.ConformanceLevel = ConformanceLevel.Document;
            using (XmlWriter writer = XmlTextWriter.Create(ms, settings))
            {
                xmls.Serialize(writer, classObject);
            }

            string xml = Encoding.UTF8.GetString(ms.ToArray());
            return xml;
        }
    }

    /// <summary>
    /// Converts given XML string to class of type T
    /// </summary>
    /// <typeparam name="T">Type to be converted</typeparam>
    /// <param name="XmlData">xml string</param>
    /// <returns>class of Type T</returns>
    public static T ToClass<T>(this string XmlData)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        T newClass;
        using (XmlTextReader reader = new XmlTextReader(new StringReader(XmlData)))
        {
            //reader.Namespaces = false;
            newClass = (T)serializer.Deserialize(reader);
        }
        return newClass;
    }
}
public class StoreDb
{
    public ObservableCollection<Product> GetProducts()
    {
        string StoreData = string.Empty;
        using(StreamReader sr = new StreamReader("store.xml"))
          {
              StoreData = sr.ReadToEnd();
          }
        ObservableCollection<Product> products = new ObservableCollection<Product>(StoreData.ToClass<List<Product>());

        return products;
    }
}
private ObservableCollection<Product> _ProductsView;
public ObservableCollection<Product> ProductsView
    {
        get { return _ProductsView; }
        set
        {
            _ProductsView = value;
            NotifyPropertyChanged();
        }
    }
File.WriteAllText("store.xml",ProductsView.ToList().ToXml());