2017-01-25 8 views
0

ItemsというObservableCollectionを持つクラスがあります。そのリストはRadGridViewをいっぱいにするはずです。 OCにはデータが含まれていても、リストは空のままで、少しデバッグした後、私は気づきました。私はプロパティのGetとSetにブレークポイントを持っています。最初にGetにヒットします。それからセットが、Getをもう一度打つことはありません。 NotifyChangedもそれ以降はgetをトリガーしてはいけません。そうすれば、ビュー内のリストが更新されますか?OnNotifyPropertyChangedは発砲しません。

は、ここで私が話していたクラスの下にコードされています

public class PagedCollection<TEntity> where TEntity : class, INotifyPropertyChanged 
{ 
    internal WorkflowEntities Context; 
    internal DbSet<TEntity> DbSet; 

    private ObservableCollection<TEntity> _items; 
    public ObservableCollection<TEntity> Items 
    { 
     get 
     { 
      return _items; 
     } 
     set 
     { 
      SetField(ref _items, value, nameof(Items)); 
     } 
    } 

    public PagedCollection() 
    { 
     Context = new WorkflowEntities(); 
     DbSet = Context.Set<TEntity>(); 
    } 

    public virtual IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null, 
              Func<IQueryable<TEntity>, IQueryable<TEntity>> query = null, 
              string includeProperties = "") 
    { 
     IQueryable<TEntity> value = DbSet; 

     if (filter != null) 
     { 
      value = value.Where(filter); 
     } 

     value = includeProperties.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries).Aggregate(value, (current, includeProperty) => current.Include(includeProperty)); 

     return query?.Invoke(value).ToList() != null ? query(value).ToList() : value.ToList(); 
    } 

    // boiler-plate 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    protected bool SetField<T>(ref T field, T value, string propertyName) 
    { 
     if (EqualityComparer<T>.Default.Equals(field, value)) return false; 
     field = value; 
     OnPropertyChanged(propertyName); 
     return true; 
    } 
} 

public virtual IEnumerable<TEntity> Get(...)は、アイテムをいっぱいに別のクラスによってトリガされています。このように:PagedCollection.Items = PagedCollection.Get();。これは、get、set、getはもうできません。したがって、データが入っていても、私のリストは空のままです。PagedCollection.Items

+0

はまた、あなたがPagedCollectionメソッドを呼び出す方法を(ビュー)リストに結合/ファイリング項目を追加&ていただけますか? – Tatranskymedved

+0

また、compare-> 'if(EqualityComparer .Default.Equals(field、value))'の結果は何ですか? – Tatranskymedved

答えて

1

あなたのクラスPagedCollectionは、INotifyPropertyChangedを実装していません。

public class PagedCollection<TEntity> where TEntity : class, INotifyPropertyChanged 

これは、TEntityがクラスであり、INotifyPropertyChangedを実装している必要があるということです。

は、代わりにこれを試してみてください:

public class PagedCollection<TEntity> : INotifyPropertyChanged where TEntity : class, INotifyPropertyChanged 
0

何かをインスタンス化しなければならないようにPagedCollection.Get();を呼び出すことはできません。

0

ことの一つは、のObservableCollectionプロパティ自体です。

あなたがプログラムを実行すると、それはビューがロードされたときに一度を取得し、それはあなたが最初にそのプロパティを初期化するときに一度を設定しています。

その後、OCプロパティを別の値(通常はItems = new ObservableCollection<TEntity>()を介して)に割り当てた場合にのみ起動されるため、リストに値を設定すると、起動されるのはPropertyChangedイベントではありません。

したがって、あなたが見なければならないイベントは、CollectionChangedです。これは、要素を追加、削除、交換、または置き換えるたびに発生します。

関連する問題