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

I have deserialized my XML file into class.cs, how can I use it in c# ViewModel

我有以下 XML 文件,我想在我的 ViewModel 中使用(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 工具自动生成 class floorplan.cs

我已使用 XmlSerializer.Deserialize 将 XML 文件放入 class、myFloorplan

的实例中

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

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

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

另一个站点建议自动生成的代码不是 "WPF friendly",一旦我将 floorplan.xml 读入 myFloorplan,我应该将其转换为在我的视图模型中可绑定数据的代码,只有在我需要写回 XML 时才将其转换回来。但这似乎我会有两个几乎相同的独立模型,一个是自动生成的,另一个我有更多的控制权。

任何建议和快速代码片段将不胜感激!

考虑到 VM 负责 View 和 Model 之间的数据传输,划出一个 VM 以适应您的 UI 是个好主意。 FloorPlan 和 VM 可能看起来相同,但它们代表软件中不同的体系结构域。 VM 可能对 FloorPlan 本身无动于衷,因为它只是帮助 show/update 数据。

您仍然可能希望 xsd class 将数据传递给虚拟机。可能一个直观的实现是:

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); }
}