Я только сейчас промочил пальцы в WPF после нескольких лет работы исключительно в ASP.Net.Проблема, с которой я сейчас борюсь, заключается в том, что у меня есть собственный класс коллекции, который мне нужно привязать к списку.Кажется, все работает, за исключением удаления элемента из коллекции.Когда я пытаюсь получить сообщение об ошибке: “Collection Remove event must specify item position.”
Проблема в том, что в этой коллекции не используются индексы, поэтому я не вижу способа указать позицию, и до сих пор Google не смог показать мне работоспособное решение ...
Класс определен для реализации ICollection<>
и INotifyCollectionChanged
.Мой внутренний контейнер элементов - это Dictionary
, который использует значение имени (строки) элемента для ключа.Помимо методов, определенных этими двумя интерфейсами, в этой коллекции есть индексатор, который позволяет элементам получать доступ по имени, и переопределяет методы Contains
и Remove
, чтобы их также можно было вызывать с именем элемента.Это работает для добавления и редактирования, но выдает вышеупомянутое исключение, когда я пытаюсь удалить.
Вот выдержка из соответствующего кода:
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
}