Привязка данных, почему она не работает? Карты C# Bing

Кажется, я не могу понять эту привязку канцелярской кнопки, и мне нужна дополнительная помощь.

У меня есть следующий код для анализа XML и разделения строки координат на Lat, Lon и Alt. Что я хочу сделать, так это отобразить эти точки в виде кнопок на моих картах Bing.

Я думал, что, создав новый объект геокоординат в Location, я мог бы привязать его к своему местоположению канцелярской кнопки, но ничего не отображается. Где я ошибаюсь?

namespace Pushpins_Itemsource
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {

            InitializeComponent();
        }

        private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
        {

            WebClient busStops = new WebClient();
            busStops.DownloadStringCompleted += new DownloadStringCompletedEventHandler(busStops_DownloadStringCompleted);
            busStops.DownloadStringAsync(new Uri("http://www.domain/source.xml"));

        }

        void busStops_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)
                return;



            var busStopInfo = XDocument.Load("Content/BusStops2.xml");

            var Transitresults = from root in busStopInfo.Descendants("Placemark")
                                 let StoplocationE1 = root.Element("Point").Element("coordinates")
                                 let nameE1 = root.Element("name")

                                 select new TransitVariables

                                     (StoplocationE1 == null ? null : StoplocationE1.Value,
                                              nameE1 == null ? null : nameE1.Value);

        }

        // Add properties to your class
        public class TransitVariables
        {
            // Add a constructor:
            public TransitVariables(string stopLocation, string name)
            {
                this.StopLocation = stopLocation;
                this.Name = name;
                if (!string.IsNullOrEmpty(StopLocation))
                {
                    var items = stopLocation.Split(',');
                    this.Lon = double.Parse(items[0]);
                    this.Lat = double.Parse(items[1]);
                    this.Alt = double.Parse(items[2]);
                }
            }

            public string StopLocation { get; set; }
            public string Name { get; set; }
            public double Lat { get; set; }
            public double Lon { get; set; }
            public double Alt { get; set; }

        }

        public class TransitViewModel
        {
            ObservableCollection<TransitVariables> Transitresults ;
            public ObservableCollection<TransitVariables> TransitCollection
            {
                get { return Transitresults; }
            }

        }
    }
}

XAML выглядит так.

<my:Map ZoomLevel="6" Height="500" HorizontalAlignment="Left" Margin="0,6,0,0" CopyrightVisibility="Collapsed" LogoVisibility="Collapsed" Name="Map" VerticalAlignment="Top" Width="456">
    <my:MapItemsControl ItemsSource="{Binding TransitVariables}" Height="494">
        <my:MapItemsControl.ItemTemplate>
            <DataTemplate>
                <my:Pushpin Location="{Binding Location}"  />
            </DataTemplate>
        </my:MapItemsControl.ItemTemplate>
    </my:MapItemsControl>
</my:Map>

person Rhys    schedule 21.09.2011    source источник
comment
Как хранятся TransitVariables? Это свойство какого-то класса где-то, и в идеале это должно быть ObservableCollection<TransitVariables>? Ваш ItemSource должен быть привязан к свойству, а не к типу.   -  person Alan    schedule 22.09.2011
comment
Databinding - как это работает? :D   -  person Jeremy    schedule 22.09.2011
comment
@Alan Местоположение из XML, который анализируется, а затем разделяется на lat long и alt. Я не понимал, что мне нужна наблюдаемая коллекция. Как бы я это реализовал?   -  person Rhys    schedule 22.09.2011
comment
@Jeremy Я раньше привязывал текст/изображения к спискам, поэтому у меня есть базовое представление о привязке данных, но мне нужно многому научиться.   -  person Rhys    schedule 22.09.2011
comment
Из кода, который вы опубликовали, ItemsSource для MapItemsControl привязан к типу, а не к свойству. Таким образом, это действительно ни к чему не привязано.   -  person Alan    schedule 22.09.2011
comment
@Rhys Я не пытался на тебя напасть, я просто пошутил.   -  person Jeremy    schedule 22.09.2011


Ответы (1)


Из кода, который вы опубликовали, похоже, проблема в том, что ItemsSource для MapsItemsControl не привязан к коллекции данных. Он привязан к типу.

Хорошо, Databinding на самом деле не работает, если вы не определяете DataContext и т. д. Здесь вы как бы смешиваете и сопоставляете парадигмы. Я думаю, что было бы хорошо когда-нибудь изучить MVVM и привязку данных, но сейчас я думаю, что можно просто сделать быстрый и грязный подход.

Самый простой способ заставить это работать — просто назначить ItemSource.

Для этого сначала назовите свой MapsItemControl, чтобы вы могли получить к нему доступ в codebheind.

<my:Map ZoomLevel="6" Height="500" HorizontalAlignment="Left" Margin="0,6,0,0" CopyrightVisibility="Collapsed" LogoVisibility="Collapsed" Name="Map" VerticalAlignment="Top" Width="456">
<my:MapItemsControl x:Name="RhysMapItems" ItemsSource="{Binding TransitVariables}" Height="494">
    <my:MapItemsControl.ItemTemplate>
        <DataTemplate>
            <my:Pushpin Location="{Binding Location}"  />
        </DataTemplate>
    </my:MapItemsControl.ItemTemplate>
</my:MapItemsControl>

Inside your download string complete handler, you should be able to do this:

    void busStops_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Error != null)
            return;



        var busStopInfo = XDocument.Load("Content/BusStops2.xml");

        var Transitresults = from root in busStopInfo.Descendants("Placemark")
                             let StoplocationE1 = root.Element("Point").Element("coordinates")
                             let nameE1 = root.Element("name")

                             select new TransitVariables

                                 (StoplocationE1 == null ? null : StoplocationE1.Value,
                                          nameE1 == null ? null : nameE1.Value);

       // This should bind the itemsource properly
       // Should use Dispatcher actually...see below
       RhysMapItems.ItemsSource = Transitresults.ToList();
    }

Теперь одно предостережение: весьма вероятно, что ваш обработчик DownloadStringCompleted будет вызываться в потоке, отличном от потока пользовательского интерфейса.

В этом случае вам нужно будет использовать Dispatcher.BeginInvoke() для изменения свойства ItemSource.

this.RootVisual.Dispatcher.BeginInvoke( _=> { RhysMapItems.ItemsSource = Transitresults.ToList();});
person Alan    schedule 21.09.2011
comment
Спасибо, но теперь я еще больше запутался. Так что мне не нужен мой <my:Pushpin Location="{Binding Location}" /> Есть ли шанс, что вы могли бы показать мне, как я должен изменить свой код, чтобы заставить это работать? - person Rhys; 22.09.2011
comment
Извините, да, вам нужно определить шаблон вашего элемента. Эта часть правильная. Чего вам не хватает, так это DataContext, который содержит коллекцию с TransitVariables, которую вы хотите показать. - person Alan; 22.09.2011
comment
спасибо, что нашли время, чтобы разъяснить мне. Я очень ценю это. Я внесу изменения сегодня вечером и посмотрим, как я поеду. Скрещенные пальцы. - person Rhys; 22.09.2011
comment
Я создал новый класс, добавил код коллекции Observable, а затем добавил остальное в мою страницу XAMl, но все равно ничего. Я также получаю, что trannies никогда не используется и не назначается - person Rhys; 22.09.2011
comment
Ну, на самом деле вам нужно загрузить trannies нужными вам данными :) Также, чтобы использовать динамическую привязку данных во время выполнения, вам нужно посмотреть на INotifyPropertyChange Если ваш TransitVariables известен при запуске, вы можете пропустить эту часть. - person Alan; 22.09.2011
comment
Как мне загрузить трансы с данными, которые я хочу? Я опубликую свой полный код, и если вы найдете время, не могли бы вы показать мне необходимые изменения? - person Rhys; 22.09.2011
comment
Хорошо, я упростил свой ответ. - person Alan; 23.09.2011