我正在尝试在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拒绝填充。
答案 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