我想在我的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。但这似乎我会有两个几乎完全相同的模型,一个是自动生成的,另一个是我可以控制的模型。
非常感谢任何建议和快速代码片段!
答案 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); }
}