我有这个自定义的可观察集合
public class ObservableLinkedList<T> : INotifyPropertyChanged, INotifyCollectionChanged, IEnumerable<T>, ICollection<T>, ICollection, IEnumerable
{
public event NotifyCollectionChangedEventHandler CollectionChanged;
public event PropertyChangedEventHandler PropertyChanged;
private LinkedList<T> _list = new LinkedList<T>();
public ObservableLinkedList()
{
}
public void Clear()
{
_list.Clear();
}
public void Add(T artist)
{
_list.AddLast(artist);
}
public Model.Artist Find(string p)
{
return null;
}
public int Count()
{
return _list.Count();
}
public IEnumerator<T> GetEnumerator()
{
return _list.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return _list.GetEnumerator();
}
public bool Contains(T item)
{
throw new NotImplementedException();
}
public void CopyTo(T[] array, int arrayIndex)
{
throw new NotImplementedException();
}
int ICollection<T>.Count
{
get { throw new NotImplementedException(); }
}
public bool IsReadOnly
{
get { throw new NotImplementedException(); }
}
public bool Remove(T item)
{
throw new NotImplementedException();
}
public void CopyTo(Array array, int index)
{
throw new NotImplementedException();
}
int ICollection.Count
{
get { throw new NotImplementedException(); }
}
public bool IsSynchronized
{
get { throw new NotImplementedException(); }
}
public object SyncRoot
{
get { throw new NotImplementedException(); }
}
}
在某些XAML中受到约束:
<Page.DataContext>
<viewModel:SearchViewModel/>
</Page.DataContext>
GridView就是这样的数据绑定
<GridView ItemsSource="{Binding Path=Artists}" Grid.Row="1">
我的SearchViewModel在术语中提出我的ObservableLinkedList,但UI永远不会得到更新。可怕的部分是,如果我用官方的ObservableCollection替换我的ObservableLinkedList,那么它可以正常工作。
CollectionChanged和PropertyChanged始终为null。我在clear方法,构造函数和add方法中使用断点检查了这一点。
有人可以告诉我如何正确实现这个吗?必须有某种方式。事实上,你甚至不必告诉我如何实现这一点,你可以指出我的方向,有人告诉我如何在头盔下完成绑定。或者如何从XAML中获取更多调试信息。
我试图删除所有异常抛出和破坏的方法。
谢谢, 马丁·斯洛特
答案 0 :(得分:1)
由于您基本上将项目存储在私人链接列表中,因此您需要自己引发相应的事件。
例如:
public void Add(T artist)
{
_list.AddLast(artist);
if (CollectionChanged != null) {
CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, Item));
}
}
答案 1 :(得分:0)
我没有时间粘贴所有代码。如果我这样做,只粘贴相关的点点滴滴,我想很多人会认为这个问题很长。
我刚才解决了这个问题。我已将代码更改为:
public class ObservableLinkedList<T> : Collection<T>, INotifyPropertyChanged, INotifyCollectionChanged
{
public event NotifyCollectionChangedEventHandler CollectionChanged;
public event PropertyChangedEventHandler PropertyChanged;
private LinkedList<T> _list = new LinkedList<T>();
public ObservableLinkedList()
{
}
public void Clear()
{
_list.Clear();
}
public int Count()
{
return _list.Count();
}
public void Add(T artist)
{
_list.AddLast(artist);
}
public Model.Artist Find(string p)
{
return null;
}
}
在所有方法中设置断点,我可以看到,当UI初始化并看到已解决绑定时,CollectionChanged不再为null,表示UI知道该集合。看起来GridView想要一个Collection而不是接口。我试图实现Collection的所有接口,没有任何编译代码的运气(这有点奇怪)。编译器抱怨有两个Add方法。我发现有点奇怪,但从来没有。 Collection的继承解决了这个问题。现在我只需要实现正确的通知。