Привязка данных, почему это не работает?Карты C # Bng - PullRequest
0 голосов
/ 21 сентября 2011

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

У меня есть следующий код для синтаксического анализа 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>

1 Ответ

1 голос
/ 22 сентября 2011

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

Хорошо, привязка данных на самом деле не работает, если вы не определите 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>

Внутри строки загрузкизавершенный обработчик, вы должны быть в состоянии сделать это:

    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();});
...