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

OnPropertyChangedSanket が既に述べたように、プロパティ値が変更されたときに呼び出す必要があります。これを行うのに最適な場所は、プロパティ セッター内です。

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

このように、プロパティに新しい値を設定するたびに、PropertyChangedイベントが発生します。

それとは別に、既存のリストに新しいアイテムを追加するだけで実装され、それについて通知できるため、 forプロパティObservableList<MetaDados>の代わりに使用する方が良い考えだと思います。コレクション全体ではなく、コレクション内のアイテム item のみが変更されるため、変更もよりスムーズにレンダリングされます。List<MetaDados>Categories.MetaDadosINotifyCollectionChangedObservableCollection<T>GridView

さらに、そうしないと、すでにレンダリングされているリストの同じインスタンスが割り当てられているため、がonGridViewを無視することさえあります。PropertyChangedCategories.MetaDados

于 2013-09-03T13:16:19.333 に答える