Я только сейчас получаю мочи в WPF после нескольких лет работы в ASP.Net исключительно. Проблема, с которой я в настоящее время борется, заключается в том, что у меня есть собственный класс коллекции, который мне нужно связать с списком. Кажется, что все работает, кроме как удалить элемент из коллекции. Когда я пытаюсь получить ошибку: "Collection Remove event must specify item position."
Уловка заключается в том, что эта коллекция не использует индексы, поэтому я не вижу способа указать позицию, и пока Google не смог показать мне работоспособное решение...
Класс определен для реализации ICollection<>
и INotifyCollectionChanged
. Мой контейнер внутренних элементов - это Dictionary
, который использует значение Name (string) для ключа. Помимо методов, определенных этими двумя интерфейсами, эта коллекция имеет индекс, который позволяет элементам получать доступ по имени и переопределяет для методов Contains
и Remove
, чтобы их также можно было вызвать с помощью элемента Name. Это работает над добавлением и редактированием, но при попытке удалить это исключение вызывается выше.
Вот выдержка из соответствующего кода:
class Foo
{
public string Name
{
get;
set;
}
}
class FooCollection : ICollection<Foo>, INotifyCollectionChanged
{
Dictionary<string, Foo> Items;
public FooCollection()
{
Items = new Dictionary<string, Foo>();
}
#region ICollection<Foo> Members
//***REMOVED FOR BREVITY***
public bool Remove(Foo item)
{
return this.Remove(item.Name);
}
public bool Remove(string name)
{
bool Value = this.Contains(name);
if (Value)
{
NotifyCollectionChangedEventArgs E = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, Items[name]);
Value = Items.Remove(name);
if (Value)
{
RaiseCollectionChanged(E);
}
}
return Value;
}
#endregion
#region INotifyCollectionChanged Members
public event NotifyCollectionChangedEventHandler CollectionChanged;
private void RaiseCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if (CollectionChanged != null)
{
CollectionChanged(this, e);
}
}
#endregion
}