2

인스턴트 메시지를 실버 라이트 빙지도에서 압핀에 바인딩하는 실제적인 두통이 있습니다.빙지도 바인딩 문제

필자는 하루 종일 내 컬렉션을 정렬하려고 노력 했으므로 이제는 압핀이 나타나지 않습니다.

항목은 아래의 이미지에 따라 마지막 줄에 중단 점을 수행 할 때 거기로 표시, 모두 143 개 항목 _pushpins에있다 :

alt text

어떤 도움에 오신 것을 환영합니다. 많은 감사.

namespace observable_collection_test 
{ 
public partial class Map : PhoneApplicationPage 
{ 

    public Map() 
    { 
     InitializeComponent(); 

     GetItems(); 
    } 

    private ObservableCollection<SItem2> pushPins; 
    public ObservableCollection<SItem2> PushPins 
    { 
     get { return this.pushPins; } 
     set 
     {  
     this.pushPins = value; 

     this.OnPropertyChanged("PushPins"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 

    } 


public void GetItems() 
    { 

     var document = XDocument.Load("ListSmall.xml"); 

     if (document.Root == null) 
      return; 

      var xmlns = XNamespace.Get("http://www.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), 

     }; 

     this.PushPins = new ObservableCollection<SItem2>(); 
     foreach (var ev in events) 
      {  
     var pushPin = new SItem2(ev.Latitude, ev.Longitude); 
     //Location = new GeoCoordinate(ev.Latitude, ev.Longitude) 
     this.PushPins.Add(pushPin); 
     } 
} 

다른 클래스 : 여기

코드입니다

namespace observable_collection_test 
{ 
public class SItem2 
{ 
      public double Latitude 
    { get; set; } 
    public double Longitude 
    { get; set; } 

    public SItem2(double Latitude, double Longitude) 
    { 
        this.Latitude = Latitude; 
     this.Longitude = Longitude; 
       } 

    public Location Location { get; set; } 
} 
} 

XAML :

<my:Map ZoomBarVisibility="Visible" ZoomLevel="10" CredentialsProvider="xxxxx" Height="508" HorizontalAlignment="Left" Margin="0,22,0,0" Name="map1" VerticalAlignment="Top" Width="456" ScaleVisibility="Visible"> 
        <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> 

답변

2

당신은 개인 필드, _pushpins, 대신에 결합하려는 public 속성 PushPins. 또한 바인딩 후에 컬렉션을 변경하는 경우 INotifyPropertyChanged를 구현하는 것을 잊지 마십시오.

+0

답변 해 주셔서 감사합니다. 내가 생각할 수있는 코드와 이미지를 편집했습니다. 아직도 기쁨이 없습니다. ObservableCollection PushPins에 대해 일종의 get set accesor가 필요합니까? –

+1

예, 필드가 아닌 속성에만 바인딩 할 수 있습니다. 또한 XAML은 여전히 ​​_PushPins를 참조합니다. – devdigital

+0

XAML을 사용하는 것이 놀랐다는 오류입니다. 모범생 오류. 나는 get/set 접근 자, ive 편집자, 그리고 여전히 기쁨이 무엇인지 잘 모르겠습니다. (전문가에게 명백한 것은 확실합니다 .-) –

1

먼저 두 가지 작업을 수행합니다. 첫째, INotifyPropertyChanged을 구현하고 PushPins 속성에 개인용 배경 필드를 사용합니다. getter에서 필드 값을 반환하고 setter에서 필드 값을 업데이트하고 PropertyChanged 이벤트를 호출합니다.

그런 다음 로컬 ObservableCollection을 생성하는 getItems 메서드 대신 메서드 내에서 PascalCase 메서드를 사용하여 루프에서 PushPins 컬렉션을 인스턴스화하고 직접 채 웁니다.

private ObservableCollectin<SItem2> pushPins; 
public ObservableCollection<SItem2> PushPins 
{ 
    get { return this.pushPins; } 
    set 
    { 
    this.pushPins = value; 
    this.OnPropertyChanged("PushPins"); 
    } 
} 

public void GetItems() 
{ 
    ... 

    this.PushPins = new ObservableCollection<SItem2>(); 
    foreach (var ev in events) 
    { 
    var pushPin = new SItem2(ev.Latitude, ev.Longitude); 
    this.PushPins.Add(pushPin); 
    } 
} 

대신 긴 위도 /를 사용하여 SItem2 생성자의 SItem2 위치 속성을 채우고 마틴 말한다대로 UI를 원하는 경우가 컬렉션에 SItem2 인스턴스의 값을 변경하면 업데이트하려면 다음 구현 SItem2의 속성에서도 INotifyPropertyChanged.

+0

지금까지 도와 주셔서 감사합니다. 코드를 현재 상태로 업데이트했습니다. 위치 항목을 만들기 위해 "Location = new GeoCoordinate (ev.Latitude, ev.Longitude)"로 무엇을하고 있는지 확신 할 수 없습니까? 내 지식 부족이 여기에 표시되어 있는지 확인하십시오 .. –

+0

SItem2 생성자에서 location 값을 어디에도 설정하지 않고 this.Location = new Location (this.Latitude, this.Longitude); – devdigital

+0

고마워, 나는 그것을 밖으로 시도 할 것이다. –