自定义ObservableLinkedList不会在我的Windows应用商店应用中绑定

时间:2013-04-02 20:09:51

标签: c# .net xaml windows-runtime windows-store-apps

我有这个自定义的可观察集合

    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中获取更多调试信息。

我试图删除所有异常抛出和破坏的方法。

谢谢, 马丁·斯洛特

2 个答案:

答案 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的继承解决了这个问题。现在我只需要实现正确的通知。