我有这个XML(示例文件):
<Record counter="1">
<Fields>
<Field name="id">4234</Field>
<Field name="county"></Field>
</Fields>
<Distance>
<Miles>0.14</Miles>
<KM>0.22</KM>
</Distance>
<Point>
<Lat>51.498199</Lat>
<Lon>-0.126334</Lon>
</Point>
</Record>
我将下面的代码放在'vList'集合中 这一切都很好。但是,我需要在GeoCoordinate中转换lat和long。
做这样的事情:
GeoCoordinate Location = new GeoCoordinate(Convert.ToDouble(Lat), Convert.ToDouble(Lon));
它需要暴露,因此可以通过xaml页面看到它转换为Pushpins。 它需要与vList保持在同一个集合中,因此XML的所有元素都保存在一起。我希望这是有道理的。我花了一整天时间试图解决这个问题,但无法看到如何最终将这个Geolocation'Location'值添加到我的收藏中。感谢。
public void ReadXML()
{
var sf = Application.GetResourceStream(new Uri("data.xml", UriKind.Relative));
using (XmlReader xr = XmlReader.Create(sf.Stream))
{
XDocument doc = XDocument.Load(xr);
var qn = XName.Get("Fields", "http://blahblah/");
var record = XName.Get("Record", "http://blahblah");
var Records = from c in doc.Descendants(record)
select c;
ObservableCollection<Venue> vList = new ObservableCollection<Venue>();
foreach (var x in Records)
{
var Fields = from c in x.Descendants(qn)
select c;
Venue lv = new Venue();
foreach (var t in Fields)
{
foreach (var e in t.Elements())
{
lv.SaveData(e.Attribute("name").Value, e.Value, lv);
}
}
var dist = XName.Get("Distance", "http//blahblah");
var Distance = from c in x.Descendants(dist)
select c;
foreach (var d in Distance)
{
foreach (var e in d.Elements())
{
lv.SaveData(e.Name.LocalName, e.Value, lv);
}
}
var pts = XName.Get("Point", "http://blahblah");
var Point = from c in x.Descendants(pts)
select c;
foreach (var d in Point)
{
foreach (var e in d.Elements())
{
lv.SaveData(e.Name.LocalName, e.Value, lv);
}
}
vList.Add(lv);
lv = null;
}
listBox1.ItemsSource = vList;
mapItems.Items.Add(vList);
//or
mapItems.ItemsSource = vList;
}
}
public class Venue //: INotifyPropertyChanged
{
public string id {get;set;}
public string county { get; set; }
public string Miles { get; set; }
public string KM { get; set; }
public string Lat { get; set; }
public string Lon { get; set; }
public void SaveData(string field, string value, Venue v)
{
foreach (MemberInfo mi in v.GetType().GetMembers())
{
if (mi.MemberType == MemberTypes.Property)
{
PropertyInfo pi = mi as PropertyInfo;
if (pi.Name == field)
{
pi.SetValue(v, value,null);
}
}
}
}
}
答案 0 :(得分:0)
我认为你在Venue模型中需要一种GeoCoordinate。不要使用纬度和经度的单独属性。据我所知,XAML中的图钉只有一个可以绑定的Location属性,它期待一种GeoCoordinate。
另外,我并没有真正达到SaveData方法的目的。当你可以使用已经公开曝光的属性时,为什么要使用反射?
我建议使用反射部分去掉SaveData方法,添加GeoCoordinate属性并使用属性创建对象。