Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UWP-绑定数据不工作-空ListView_C#_Listview_Data Binding_Uwp_Uwp Xaml - Fatal编程技术网

C# UWP-绑定数据不工作-空ListView

C# UWP-绑定数据不工作-空ListView,c#,listview,data-binding,uwp,uwp-xaml,C#,Listview,Data Binding,Uwp,Uwp Xaml,我目前正在尝试在listview内部进行单向数据绑定,这样当我的应用程序启动时,它将打开一个方法,检查传入的包,填充一个列表,并将该列表绑定到一个listview,该listview将显示每个包及其信息。然而,由于某些原因,ListView实际上并没有被填充。我已经调试过了,所有的后端代码都运行良好——本地变量,比如包模型和模型列表,都可以完美地填充。但是,ListView不包含任何内容,当我查看局部变量时,它会将每个内容片段显示为完全空的 这是我的密码: DeliveryPlannerData

我目前正在尝试在listview内部进行单向数据绑定,这样当我的应用程序启动时,它将打开一个方法,检查传入的包,填充一个列表,并将该列表绑定到一个listview,该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
    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拒绝填充。

正如您根据上面的注释所注意到的,您需要使用
ObservableCollection
,以使其正常工作。但原因有点模糊

设置视图的
DataContext
属性时,视图将转到绑定属性并绑定它们,一旦。。。因此,如果在初始化
DataContext
时,您的集合中没有任何内容,那么您将无法在视图中获得任何内容

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

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

这里是
可观察收集
发挥作用的地方。您的
observateCollection
将为您更新
UI
,这样您就不需要调用属性更改事件

从中可以看到,它实现了
INotifyPropertyChanged

[SerializableAttribute]
public class ObservableCollection<T> : Collection<T>, INotifyCollectionChanged, 
    INotifyPropertyChanged
[SerializableAttribute]
公共类ObservableCollection:Collection,INotifyCollectionChanged,
InotifyProperty已更改
如果在将项目添加到列表中后调用属性更改事件,则也不需要
ObservableCollection

这是一个

这是你的电话号码


这里是一个

尝试制作
发货
一个嘿,谢谢!这非常有效。如果您不介意的话,您能解释一下为什么从列表更改为ObservableCollection会起作用吗?是的,您需要ObservableCollection。看到这里的区别了吗。