如何将xml绑定到mvvm wpf



我有个问题。我有wpf-mvvm应用程序,我需要绑定xml,但我不知道如何绑定。

我有元素模型,元素vm和一个视图。一切都可行,但所有这些元素都有"一些基础"模型。

class ItemModel
{
public ItemModel(string name, double weight, double sg, double volume)
{
Name = name;
Weight = weight;
Sg = sg;
Volume = volume;
}
public string Name { get; set; }
public double Weight { get; set; }
public double Sg { get; set; }
public double Volume { get; set; }
}

这是我的虚拟机。

class ItemViewModel : BaseVM
{
public ItemViewModel(string name, double sg, double weight,  double volume)
{
Name = name;
Weight = weight;
Sg = sg;
Volume = volume;
}
public string Name { get; set; }
private double _weight;
public double Weight
{
get => _weight;
set
{
_weight = value;
RaisePropertyChanged();
}
}
private double _sg;
public double Sg
{
get => _sg;
set
{
_sg = value;
Weight = value * _volume;
RaisePropertyChanged("Weight");
RaisePropertyChanged("Sg");
}
}

private double _volume;
public double Volume
{
get => _volume;
set
{
_volume = value;
_weight = value * _sg;
RaisePropertyChanged();
RaisePropertyChanged("Weight");
RaisePropertyChanged("Sg");
}
}
}

这是我的MainVM

class MainViewModel
{
private DataModel Data;
public ObservableCollection<ItemViewModel> Items { get; set; }
public ListCollectionView FilteredItems { get; set; }

public MainViewModel()
{
Data = new DataModel();
Items = new ObservableCollection<ItemViewModel>();
FilteredItems = new ListCollectionView(Items)
{
Filter = item => ((ItemViewModel)item).Volume != 0,
IsLiveFiltering = true,
LiveFilteringProperties =
{
nameof (ItemViewModel.Volume)
}
};
Load();
}
public void Load()
{
foreach (var item in Data.GetItems())
Items.Add(new ItemViewModel(item.Name, item.Weight, item.Sg, item.Volume));
}
}

我有一些"数据模型">

class DataModel
{
public List<ItemModel> GetItems() =>
new List<ItemModel>
{
new ItemModel("Water", 0.00, 1.025, 0.00),
new ItemModel("Ballast", 0.00, 1.000, 0.00),
new ItemModel("Oil", 0.00, 1.040, 0.00),
};
}

这是我想要绑定的xml。

<ballast>
<tank ID="FPTW" Name="Forepeak" Weight="0.00" SG="1.025" Volume="0.00"> </tank>
</ballast>

请帮助我如何在DataModel中绑定此xml文件而不是列表。

我强烈建议将XML反序列化为"真实"对象。在你的例子中,你想在你的程序中有一个坦克的列表。视图(XAML)不应该知道"数据存储"是xml文件、数据库还是其他什么。只需绑定一个TankViewModel的列表(或者在你的情况下,你将其命名为ItemViewModel。希望你不会用所有这些坦克炸毁一些东西…

这就是如何将xml反序列化为"真实"对象(完整的工作控制台应用程序:

https://dotnetfiddle.net/zCHSmc

using System;
using System.IO;
using System.Xml.Serialization;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
MainViewModel vm = new MainViewModel();
foreach(tank t in vm.ListOfTanks.ballast)
{
Console.WriteLine(t.ID);
}

}
public class MainViewModel
{
public tanks ListOfTanks
{
get
{
string xmlContent = "<?xml version="1.0" encoding="utf-16"?><tanks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">  <ballast><tank><ID>ksj</ID></tank>  </ballast></tanks>";
tanks allTanks = null;
XmlSerializer serializer = new XmlSerializer(typeof(tanks));
//if you have a xml file you can use serializer.Deserialize("yourFile.xml"); instead of the "in memory stream"
using (TextReader reader = new StringReader(xmlContent))
{
allTanks =(tanks)serializer.Deserialize(reader);
}
return allTanks;
}
}
}

public class tanks
{
public tanks()
{
ballast = new List<tank>();
}
public List<tank> ballast {get;set;} 
}

public class tank
{
public string ID {get;set;}
}
}

最新更新