一个SCA IDE的平台模块,需要将几类配置文件显示给用户并提供编辑修改的功能,其中用户添加某些信息项的时候需要结合其他信息做验证,现在想把界面和对xml文件的操作分层,目标是下层逻辑能完全复用,上网查了不少方法,写着写着就发现又不行了,主要就是数据验证的问题,比如下面这种情况: <element1>
   <element2>
   <element2>
 <element1>
  用户可以对element2这一项信息进行修改,删除,添加,并且修改和添加都需要结合外部其他信息验证,验证的结果不但决定下层数据的变化,也决定了界面的一些行为,那这两层是怎么交互呢?还有比较郁闷的就是用户修改的信息可以全盘撤销,在实际底层xml数据和用户之间需要有一层临时数据。刚接触C#不久,很多架构方面的东西也不太懂。说的也有点乱,还请各位大大帮忙分析啊,模块都重构好几次了,还是很烂,郁闷啊

解决方案 »

  1.   

    定义对象
        [Serializable]
        public class Device
        {
            [XmlElement]
            public string Name { get; set; }        [XmlElement]
            public string ID { get; set; }
        }
    序列化
                Device device = new Device()
                {
                    ID = "1",
                    Name = "MyDevice"
                };            XmlSerializer serializer = new XmlSerializer(typeof(Device));
                using (FileStream stream = new FileStream("c:/Device.xml", FileMode.Create))
                {
                    using (StreamWriter writer = new StreamWriter(stream))
                    {
                        serializer.Serialize(writer, device);
                    }
                }序列化后得到的 Device.xml
    <?xml version="1.0" encoding="utf-8"?>
    <Device xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Name>MyDevice</Name>
      <ID>1</ID>
    </Device>反序列化
                using (FileStream stream = new FileStream("c:/Device.xml", FileMode.Open))
                {
                    device = serializer.Deserialize(stream) as Device;
                }反序列化后就可以拿到Device对象了,之后绑定UI就方便了
      

  2.   

    既然是 XML,可以用 Path 来交互,比如要修改 element2 时就传递字符串 element1/element2 和改变后的值。验证如果是和 XML 中的数据比较就在下层中提供方法,如果是和其它数据比较就放上层。撤销的话下层模块读取 XML 后就是一个内存临时数据,修改方法里记录每一次修改,再提供方法返回撤销之后的数据,并提供保存方法将临时数据写入文件。