【问题标题】:UWP - Binding Data Not Working - Empty ListViewUWP - 绑定数据不起作用 - 空 ListView
【发布时间】:2016-11-18 23:17:08
【问题描述】:

我目前正在尝试在列表视图中进行单向数据绑定,这样当我的应用程序启动时,它将打开一个方法,检查传入的包,填充列表,并将该列表绑定到列表视图然后将显示每个包及其信息。但是,出于某种原因,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

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

这显然不是每个文档中的所有代码,但它是重要的部分。 我想知道我做错了什么? listView 拒绝填充。

【问题讨论】:

  • 尝试制作shipmentsObservableCollection
  • 嘿,谢谢!那工作得很好。如果您不介意,您能解释一下为什么从 List 更改为 ObservableCollection 可以做到这一点吗?
  • 是的,你需要 ObservableCollection。看这里的区别。 stackoverflow.com/a/4197068/4585476

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


【解决方案1】:

正如您根据上面的 cmets 注意到的那样,您需要使用 ObservableCollection&lt;T&gt; 才能使其正常工作。原因虽然有点模糊。

当您设置 View 的 DataContext 属性时,View 会转到绑定的属性并绑定它们一次...因此,如果在初始化 DataContext 时您的集合中没有任何内容,那么您就不会去获取视图中的任何内容。

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

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

这就是ObservableCollection 发挥作用的地方。您的ObservableCollection 将为您更新UI,这样您就无需调用您的属性更改事件。

MSDN Documentation on ObservableCollection&lt;T&gt;可以看出,它实现了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

【讨论】:

    猜你喜欢
    • 2018-03-15
    • 1970-01-01
    • 2016-12-01
    • 2019-01-28
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多