当我第一次加载View时,我会执行以下代码来设置GridView Source:
ObservableCollection<Categories> categories = await TargetUtils.GetCategoriesRemoteAsync(year);
collectionTarget.Source = categories;
一切正常,直到我尝试通过添加一些新项目来更新我的gridview,因为在互联网上找到了很多教程我使用了ObservableCollection并实现了INotifyPropertyChanged来更新它。
我的INotifyPropertyChanged实施:
public class Model : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(String propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
我的类别类:
public class Categories : Model
{
public String Type { get; set; }
public List<MetaDados> MetaDados { get; set; }
public Categories(String Type)
{
this.Type = Type;
}
}
public class MetaDados : Model
{
//NORMAL IMPLEMENTATION
}
并更新我这样做:
await TargetUtils.GetParcellableCategoriesRemoteAsync(Constants.FULL, year, (ObservableCollection<Categories>)collectionTarget.Source);
调用:
public static async Task<ObservableCollection<Categories>> GetParcellableCategoriesRemoteAsync(String type, int year, ObservableCollection<Categories> categories)
{
foreach (Categories c in categories)
{
if (c.Type.Equals(type))
{
c.MetaDados = await LoadMetaDadosTask.loadMetaDados(type, year, c.MetaDados);
}
}
return categories;
}
最后:
public static async Task<List<MetaDados>> loadMetaDados(String type, int year, List<MetaDados> metaDados)
{
//MY UPDATE CODE AND:
metaDados.Add(PARAMETERS);
return metaDados;
}
我不知道为什么我的gridView不会更新如果我正在使用ObservableCollection并实现INotifyPropertyChanged,我们非常感谢你的帮助。
答案 0 :(得分:0)
只有实施INotifyPropertyChanged才对您有所帮助。
您还需要提升ProeprtyChagned事件。否则,绑定将不知道存在更改。
在完成将类别加载到ObservableCollection后调用Raise Property Change事件,你很高兴。
答案 1 :(得分:0)
正如Sanket已经提到的,当属性值发生变化时,您需要调用OnPropertyChanged
。最好的地方是在物业设定者内部,例如
private String _type;
public String Type
{
get
{
return _type;
}
set
{
_type = value;
OnPropertyChanged("Type");
}
}
这样,每次为属性设置新值时,都会引发PropertyChanged
事件。
除此之外,我认为对ObservableList<MetaDados>
属性使用List<MetaDados>
而不是Categories.MetaDados
会更好一点,因为你是onyl将新项添加到现有列表中INotifyCollectionChanged
由ObservableCollection<T>
实施的1}}可以通知GridView
有关它的信息。更改也将更流畅,因为只有集合中的项目项将更改而不是整个集合。
此外,否则甚至可能会GridView
忽略PropertyChanged
上的Categories.MetaDados
,因为已经分配了已经呈现的列表的相同实例。