0

当我第一次加载我的视图时,我执行以下代码来设置 GridView 源:

ObservableCollection<Categories> categories = await TargetUtils.GetCategoriesRemoteAsync(year);

collectionTarget.Source = categories;

一切都很好,直到我尝试通过添加一些新项目来更新我的网格视图,因为在互联网上找到了很多教程,我使用了 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;
        }

如果我使用 ObservableCollection 并实现 INotifyPropertyChanged,我不知道为什么我的 gridView 不更新,非常感谢一些帮助。

4

2 回答 2

0

仅实现 INotifyPropertyChanged 对您没有帮助。

您还需要引发 ProeprtyChagned 事件。否则,绑定将不知道有变化。

将类别加载到 ObservableCollection 后调用 Raise Property Change 事件,一切顺利。

于 2013-09-03T11:21:28.387 回答
0

正如 Sanket 已经提到的,您需要OnPropertyChanged在属性值更改时调用。最好的地方是在属性设置器内,例如

private String _type;
public String Type 
{ 
    get
    {
        return _type;
    }
    set
    {
        _type = value;
        OnPropertyChanged("Type");
    }
}

这样,每次为属性设置新值时,PropertyChanged都会引发事件。

除此之外,我认为使用ObservableList<MetaDados>而不是List<MetaDados>for Categories.MetaDadosproperty 会是一个更好的主意,因为您只是将新项目添加到现有列表中INotifyCollectionChanged并由ObservableCollection<T>可以通知GridView它来实现。更改也将更流畅地呈现,因为只有集合中的项目项会更改,而不是整个集合。

此外,否则它甚至可能GridView会忽略PropertyChangedon,Categories.MetaDados因为已经分配了相同的列表实例。

于 2013-09-03T13:16:19.333 回答