前因:实现INotifyPropertyChanged接口:如果您的数据模型(Model)中的集合发生了变化(如添加了新的对象),该集合需要实现INotifyCollectionChanged接口,以便通知视图集合已经改变。对于集合中的单个元素,如果它们的属性发生变化也需要通知视图,那么这些元素应实现INotifyPropertyChanged接口。
1.数组使用的是list ,而不是ObservableCollection。ObservableCollection实现了INotifyCollectionChanged接口,可以自动通知视图集合中的更改。
//之前:
public List<KeyValuePair<long, string>> SoftwareTypes { get; set; } = new List<KeyValuePair<long, string>>();
//修改:
public ObservableCollection<KeyValuePair<long, string>> SoftwareTypes { get; set; } = new ObservableCollection<KeyValuePair<long, string>>();
2.线程问题:通过异步任务执行请求回调代码并不是在UI线程上运行,UI线程并没有被用来更新视图,这可能会导致更新问题。确保所有与UI相关的操作都在主UI线程上执行。可以使用Dispatcher.Invoke()或Dispatcher.BeginInvoke()来在UI线程上执行代码。
//之前 :
foreach (var item in data)
{
{
SoftwareTypes.Add(new KeyValuePair<long, string>(item.Id, item.TypeName));
}
if (Data.SoftwareTypeId > 0)
{
SelectSoftwareType = SoftwareTypes.FirstOrDefault(o => o.Key == Data.SoftwareTypeId);
}
else
{
SelectSoftwareType = SoftwareTypes.FirstOrDefault();
}
}
//修改:
App.Current.Dispatcher.Invoke(() =>
{
foreach (var item in data)
{
SoftwareTypes.Add(new KeyValuePair<long, string>(item.Id, item.TypeName));
}
if (Data.SoftwareTypeId > 0)
{
SelectSoftwareType = SoftwareTypes.FirstOrDefault(o => o.Key == Data.SoftwareTypeId);
}
else
{
SelectSoftwareType = SoftwareTypes.FirstOrDefault();
}
});
总结:MVVM模式中更新前端数据源要实现INotifyPropertyChanged接口,并且由主线程(ui线程)执行