我已将我的XML文件反序列化为class.cs,如何在c#ViewModel中使用它

时间:2015-04-20 02:53:08

标签: c# xml wpf xmlserializer

我想在我的ViewModel中使用以下XML文件(XML文件已经简化):

<?xml version="1.0" encoding="utf-8"?>
<FloorPlan xmlns="http://www.ioc.org">
  <version>1.0</version>
  <room type="bathroom">
    <width>10</width>
    <length>10</length>
    <floor>tile</floor>
  </room>
  <room type="bedroom">
    <width>15</width>
    <length>20</length>
    <furniture>
      <bed>
        <location></location>
      </bed>
      <dresser>
        <location></location>
      </dresser>
    </furniture>
  </room>
</FloorPlan>

我使用Visual Studio的xsd.exe工具自动生成类floorplan.cs

我使用XmlSerializer.Deserialize将XML文件转换为类的实例myFloorplan

我有一个用户界面,必须显示myFloorpan的复杂可视化表示,允许用户更新它,并检查业务逻辑以确保用户只进行有效更新。用户完成后,会将其写入newFloorplan.xml

如何将我的UI中的数据绑定到myFloorplan?

Adding INotifyPropertyChange in generated EF classes表示不在模型上实现INotifyPropertyChanged,而是使用事件。但是这些都需要在floorplan.cs中修改自动生成的代码,这似乎是一个坏主意。

另一个网站建议自动生成的代码不是“WPF友好”,一旦我将floorplan.xml读入myFloorplan,我就应该将其转换为我的视图模型中可绑定数据的东西,只将其转换回来如果我需要回写XML。但这似乎我会有两个几乎完全相同的模型,一个是自动生成的,另一个是我可以控制的模型。

非常感谢任何建议和快速代码片段!

1 个答案:

答案 0 :(得分:0)

考虑到VM负责View和Model之间的数据传输,最好划伤VM以适应您的UI。 FloorPlan和VM看起来可能完全相同,但它们代表了软件中不同的架构域。 VM可以对FloorPlan本身无动于衷,因为它只是帮助显示/更新数据。

您仍然可能希望xsd类将数据传递给VM。可能直观的实现是:

var floor_plan = (FloorPlan)XmlSerializer.Deserialize(source);
ui.DataContext = new ViewModel(floor_plan);

ViewModel.cs

public ViewModel(FloorPlan floorPlan) { _floorPlan = floorPlan; )
public double SomeData {
  get { return _floorPlan.SomeData; } 
  set { _floorPlan.SomeData = value; OnPropertyChanged<double>(() => SomeData); }
}