UWP - 绑定数据不起作用 - 清空ListView

时间:2016-07-15 16:46:14

标签: c# listview data-binding uwp uwp-xaml

我正在尝试在listview中进行单向数据绑定,这样当我的应用程序启动时,它将打开一个方法,检查传入的包,填充列表,并将该列表绑定到列表视图然后会显示每个包的信息。但是,出于某种原因,ListView实际上并未填充。我已经调试了,并且所有的后端代码都运行正常 - 局部变量,例如包模型和模型列表,都完美填充。但是,ListView不包含任何内容,当我查看局部变量时,它会将每个内容片段显示为完全空。

这是我的代码:

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 个答案:

答案 0 :(得分:2)

正如您在上述评论中所注意到的那样,您需要使用ObservableCollection<T>才能使其生效。原因虽然有点模糊。

当您设置View的DataContext属性时,View会转到绑定的属性并将它们绑定一次......所以如果在初始化DataContext时,您的集合中没有任何内容,那么您在视图中不会得到任何东西。

为了解决这个问题,我们实现了名为INotifyPropertyChanged的接口。我们在ViewModels和Models上使用它。

此界面的作用是为您提供可用于更新UI的事件处理程序。您在事件中发送属性名称,当UI处理它时,它会捕获属性名称,检查它是否有绑定到该属性的任何内容,如果有,则退出并使用新值更新它。

这里是ObservableCollection发挥作用的地方。您的ObservableCollection会为您更新UI,以便您无需致电您的酒店更改活动。

正如您从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