2016-07-15 4 views
2

私は現在、リストビュー内で一方向データバインディングを実行しようとしているので、アプリケーションが起動すると、メソッドが開き、入ってくるパッケージをチェックし、そのリストをlistviewにバインドすると、各パッケージに情報が表示されます。しかし、何らかの理由で、ListViewが実際にデータを取り込むわけではありません。私はデバッグを行い、バックエンドコードはすべて正常に動作しています。パッケージモデルやモデルリストなどのローカル変数はすべて完全に実装されています。しかし、ListViewはコンテンツを保持していません。ローカル変数を見ると、各コンテンツが完全に空であることが示されます。ここでUWP - バインディングデータが機能していない - 空リストビュー

は私のコードです:

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

DeliveryPlanner.xaml

<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(https://msdn.microsoft.com/en-usを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というこのインターフェイスを実装します。 ViewModelとモデルでこれを使用します。

このインターフェイスは、UIを更新するために使用できるイベントハンドラを提供します。イベントでプロパティ名を送信し、UIがそれを処理するとき、プロパティ名を取得し、そのプロパティにバインドされているものがあるかどうかを確認し、そうであれば、新しい値で更新します。

ここにはObservableCollectionが出場します。 ObservableCollectionUIを更新し、プロパティ変更イベントを呼び出す必要はありません。

あなたがMSDN Documentation on ObservableCollection<T>から見ることができるように、それはINotifyPropertyChanged

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

はあなたのリストに項目を追加した後、イベントを変更されたプロパティと呼ばれていた、あなたはどちらかObservableCollectionを必要としない実装します。ここ

ここArticle on How DataBinding works

あるここMSDN Documentation on INotifyPropertyChanged

example on how to implement INotifyPropertyChanged

関連する問題