Наблюдаемые проблемы с коллекцией - PullRequest
0 голосов
/ 16 января 2011

Я борюсь с коллекциями Observable и использую их для добавления меток на карту Silverlight. Я пытаюсь создать коллекцию здесь, используя 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 #!), Поэтому любая помощь / совет приветствуются. Большое спасибо.

UPDATE:

Кажется, теперь все в порядке, проблема выше, но теперь мои вещи не привязываются к кнопкам. Я посмотрел на «PushPins = pushPinCollection;» Метод и все 143 элемента находятся там с широтой, длиной и местоположением с правильными данными - согласно этой точке останова:

alt text

Может быть, есть проблема с моей привязкой 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> 

Было бы также полезно узнать, правильно ли я подхожу к привязке канцелярской кнопки к картам.

1 Ответ

1 голос
/ 16 января 2011

Похоже, это потому, что вы использовали x:Name="PushPinItems" в своем XAML, имя которого совпадает с именем одного из ваших типов, поэтому, когда вы думаете, что ссылаетесь на свой тип PushPinItems в своем коде, вы фактически ссылаетесь на полечто VS сгенерировал для вас из вашего XAML, который представляет этот экземпляр Pushpin.Вы можете использовать другой x:Name в своем XAML.

Обновление

Хорошо, я вижу проблему :) Я раньше не работал с элементом управления картами Bing, но, глядя на http://forums.silverlight.net/forums/t/197631.aspx (второй пост вниз), вам нужно установить свойство MapItemsControl элементов управления картой.Свойство ItemsSource здесь должно быть привязано к вашей ObservableCollection пользовательского типа, который содержит такие свойства, как Name и Location.Затем вы можете заполнить эту коллекцию экземплярами этого пользовательского типа (в сообщении они использовали MapData в качестве имени типа).

Вы также можете получить дополнительные примеры и исходный код по адресу http://www.microsoft.com/maps/isdk/silverlight/

...