我正在努力研究Observable系列并使用它将图钉添加到silverlight bing地图上。我试图使用Linq在这里建立一个集合。但我在我的代码中的每个“PushPinItems”实例下得到错误:
'observable_collection_test.Map.PushPinItems' is a 'field' but is used like a 'type' c:\users\dan\documents\visual studio 2010\Projects\observable collection test\observable collection test\Map.xaml.cs 26 38 observable collection test
不确定这里发生了什么,我是宣布/构建错误还是什么? 我是Observable系列的新手(以及大多数c#!),欢迎任何帮助/建议。非常感谢。
更新
现在这似乎没问题,上面的问题,但现在它没有将我的项目绑定到图钉。 我看过“PushPins = pushPinCollection;”方法和所有143项都在那里有纬度,长度和位置属性以及正确的数据 - 根据这个断点:
我的XAML绑定可能有问题吗?
以下是更新后的代码:
namespace observable_collection_test
{
public partial class Map : PhoneApplicationPage
{
private ObservableCollection<SItem2> _PushPins;
public event PropertyChangedEventHandler PropertyChanged;
public Map()
{
InitializeComponent();
getItems();
}
public ObservableCollection<SItem2> PushPins
{
get
{
return _PushPins;
}
private set
{
_PushPins = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("PushPins"));
}
}
}
private GeoCoordinate _location;
public GeoCoordinate Location
{
get { return _location; }
set
{
if (_location != value)
{
_location = value;
}
}
}
private string _pinSource;
public string PinSource
{
get { return _pinSource; }
set
{
if (_pinSource != value)
{
_pinSource = value;
}
}
}
public void getItems()
{
var document = XDocument.Load("ListSmall.xml");
if (document.Root == null)
return;
var xmlns = XNamespace.Get("http://www.blahblah.co.uk/blah");
var events = from ev in document.Descendants("item")
select new
{
Latitude = Convert.ToDouble(ev.Element(xmlns + "Point").Element(xmlns + "lat").Value),
Longitude = Convert.ToDouble(ev.Element(xmlns + "Point").Element(xmlns + "long").Value),
};
ObservableCollection<SItem2> pushPinCollection = new ObservableCollection<SItem2>();
foreach (var ev in events)
{
SItem2 PushPin = new SItem2
( ev.Latitude, ev.Longitude)
{
};
pushPinCollection.Add(PushPin);
}
PushPins = pushPinCollection;
}
其他课程:
namespace observable_collection_test
{
public class SItem2
{
//public DateTimeOffset Date { get; set; }
//public string Title
//{ get; set; }
public double Latitude
{ get; set; }
public double Longitude
{ get; set; }
public GeoCoordinate Location
{ get; set; }
//public Uri Link { get; set; }
public SItem2(//string Title,
double Latitude, double Longitude)
{
//this.Date = Date;
//this.Title = Title;
this.Latitude = Latitude;
this.Longitude = Longitude;
//this.Location = Location;
//this.Link = Link;
}
}
关于添加引脚到映射的XAML位:
<my:Map ZoomBarVisibility="Visible" ZoomLevel="10" CredentialsProvider="AhqTWqHxryix_GnWER5WYH44tFuutXNEPvFm5H_CvsZHQ_U7-drCdRDvcWSNz6aT" Height="508" HorizontalAlignment="Left" Margin="0,22,0,0" Name="map1" VerticalAlignment="Top" Width="456">
<my:MapItemsControl ItemsSource="{Binding PushPins}" >
<my:MapItemsControl.ItemTemplate>
<DataTemplate>
<my:Pushpin Background="Aqua" Location="{Binding Location}" ManipulationCompleted="pin_click">
</my:Pushpin>
</DataTemplate>
</my:MapItemsControl.ItemTemplate>
</my:MapItemsControl>
</my:Map>
知道我是否正在以正确的方式接近图钉绑定地图也是一件好事。
答案 0 :(得分:1)
看起来好像这是因为您在XAML中使用了x:Name="PushPinItems"
,它与您的某个类型名称相同,所以当您认为在代码隐藏中引用了PushPinItems类型时,实际上是在引用VS从您的XAML为您生成的字段,表示该Pushpin实例。您可以在XAML中使用不同的x:Name
。
<强>更新强>
好的,我看到了问题:)我以前没有使用Bing地图控件,但是看http://forums.silverlight.net/forums/t/197631.aspx(第二篇文章下来),你需要设置地图控件MapItemsControl属性。这里的ItemsSource属性应绑定到自定义类型的ObservableCollection,该类型包含Name和Location等属性。然后,您可以使用此自定义类型的实例填充此集合(在帖子中,他们使用MapData作为类型名称)。
获取更多示例和源代码