2016-07-15 4 views
2

현재 응용 프로그램이 시작될 때 메소드를 열고, 들어오는 패키지를 확인하고, 목록을 채울 수 있도록 목록보기 내 단방향 데이터 바인딩을 수행하려고합니다. , 그리스트를 listview에 바인드하면 각 패키지에 정보가 표시됩니다. 그러나 어떤 이유로 ListView가 실제로 채워지지 않습니다. 디버깅을했고 백엔드 코드가 모두 잘 작동합니다. 패키지 모델 및 모델 목록과 같은 로컬 변수가 모두 완벽하게 채워집니다. 그러나, ListView 어떤 콘텐츠를 보유하지 않으며 내가 로컬 변수를 보면 각 콘텐츠 조각을 완전히 비어있는 것으로 보여줍니다.UWP - 바인딩 데이터가 작동하지 않음 - 빈 ListView

012 DeliveryPlanner.xaml

DeliveryPlannerData.cs

public static List<ShipmentModel> shipments { get; set; } = new List<ShipmentModel>(); 

    public async static void populateDeliveryPlanner(string startDate, string endDate) 
    { 
     var deliveryPlanner = await DeliveryPlanner.DeliveryPlannerRequest(startDate, endDate); 
     //if (panel.Children.Count > 0) 
     // panel.Children.Clear(); 

     try 
     { 
      List<string> trackingNumber = deliveryPlanner["trackingNumber"]; 
      List<string> lastScanDate = deliveryPlanner["lastScanDate"]; 
      List<string> scheduledDelivery = deliveryPlanner["scheduledDelivery"]; 
      List<string> status = deliveryPlanner["status"]; 


      for (int i = 0; i < trackingNumber.Count; i++) 
      { 
       shipments.Add(new ShipmentModel(
        trackingNumber[i], lastScanDate[i], scheduledDelivery[i], getStatus(status[i]) 
       )); 
       var v = shipments; 
      } 

     } 
     catch (NullReferenceException e) 
     { 
      var error = e; 
     } 
    } // populateDeliveryPlanner 

ShipmentModel.cs

public class ShipmentModel : INotifyPropertyChanged 
{ 
    public string TrackingNumber; 
    public string LastScanDate; 
    public string ScheduledDelivery; 
    public string Status; 
    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 

    public ShipmentModel(string trackingNumber, string lastScanDate, string scheduledDelivery, string status) 
    { 
     TrackingNumber = trackingNumber; 
     LastScanDate = lastScanDate; 
     ScheduledDelivery = scheduledDelivery; 
     Status = status; 
    } 

    public string trackingNumber 
    { 
     get { return this.TrackingNumber; } 
     set 
     { 
      this.TrackingNumber = value; 
      this.OnPropertyChanged(); 
     } 
    } 

: 여기

내 코드입니다

<ListView x:Name="listView" ItemTemplate="{StaticResource ShipmentModelTemplate1}" ItemsSource="{Binding shipments, Mode=OneWay}" Margin="19,12,19,0" Grid.Row="1" VerticalAlignment="Bottom"/>

이것은 분명히 각 문서의 모든 코드는 아니지만 중요한 부분입니다. 내가 잘못하고있는 것이 궁금합니다. listView는 채우지 않습니다.

+1

는 '이 [ObservableCollection에] shipments' 만드는 시도이며 /library/ms668604(v=vs.110).aspx) –

+0

안녕하세요, 감사합니다! 그것은 완벽하게 작동했습니다. 괜찮 으면 List <>에서 ObservableCollection <>으로 변경하면 왜이 작업을 수행했는지 설명 할 수 있습니까? – msiegs

+0

예 ObservableCollection이 필요합니다. 차이점을 여기에서보십시오. http://stackoverflow.com/a/4197068/4585476 – AVK

답변

2

위의 설명에 따라 눈치 채 셨으니 이것을 적용하려면 ObservableCollection<T>을 사용해야합니다. 그 이유는 조금 애매합니다.

보기의 DataContext 속성을 설정하면보기가 바운드 속성으로 나가서 바인딩합니다. 따라서 DataContext의 초기화에서 아무 것도 얻지 못할 경우 보기에서.

이 문제를 해결하기 위해 INotifyPropertyChanged이라는이 인터페이스를 구현했습니다. 우리는 이것을 ViewModels과 Models에 사용합니다.

이 인터페이스는 UI를 업데이트하는 데 사용할 수있는 이벤트 처리기를 제공합니다. 이벤트에서 속성 이름을 보내고 UI가 속성 이름을 처리하면 속성 이름을 캡처하고 해당 속성에 바인딩 된 것이 있는지 확인한 다음 속성에 연결되면 새 값으로 업데이트합니다.

여기에 ObservableCollection이 등장합니다. ObservableCollectionUI을 업데이트하므로 속성 변경 이벤트를 호출 할 필요가 없습니다. 당신이 MSDN Documentation on ObservableCollection<T>에서 볼 수 있듯이

, 그것은

[SerializableAttribute] 
public class ObservableCollection<T> : Collection<T>, INotifyCollectionChanged, 
    INotifyPropertyChanged 

INotifyPropertyChanged 당신이, 당신은 어느 쪽 ObservableCollection이 필요하지 않을 목록에 항목을 추가 한 후 속성 변경 이벤트라고했다 구현합니다.여기

은 여기 Article on How DataBinding works

이다 (https://msdn.microsoft.com/en-us를 여기 MSDN Documentation on INotifyPropertyChanged

example on how to implement INotifyPropertyChanged

관련 문제