Невозможно выполнить итерацию объекта Observable Collection в объекте, помещенном в другую Observable Collection

(Извините, если название доставляет столько хлопот, я чувствую себя довольно запутанным, чтобы дать ему название.)

У меня проблема с итерацией (либо for, либо foreach) объекта ObservableCollection в объекте, который помещен в другой ObservableCollection.

ЭТО МОЙ КЛАСС "ОБЪЕКТ" (в переносимой библиотеке классов)

public class NotationGroup : INotifyPropertyChanged
{
    ...
    private ObservableCollection<Notation> _notations;
    ...
    public ObservableCollection<Notation> Notations
    {
        get { return _notations; }
        set { _notations = value; NotifyPropertyChanged("Notations"); }
    }

    ...
}

И ВОТ КАК Я ПОЛУЧИЛ ЕГО ДОСТУП

public class MainWindowModelView : INotifyPropertyChanged
{
    ...
    private ObservableCollection<NotationGroup> _notationGroups;
    ....
    public ObservableCollection<NotationGroup> NotationGroups 
    { get { return _notationGroups; } set { _notationGroups = value; NotifyPropertyChanged("NotationGroups"); } }

    ...

    public void AddOrUpdateNote(Notes note, ModifierKeys mKeys)
    {
        if (mKeys == ModifierKeys.Control)
        {
            foreach (NotationGroup item in NotationGroups)
            {
                for (int i = 0; i < item.Notations.Count; i++) //ERROR 1
                {
                    if (item.Notations[i].IsSelected) //ERROR 2
                    {
                        item.Notations[i].Note = note; //ERROR 3
                    }   
                }
            }
        }
        else
        {
            if (NotationGroups.Count(x => x.IsSelected) > 1)
            {
                var selectedNG = NotationGroups.FirstOrDefault(x => x.IsSelected);

                ClearSelected();

                (selectedNG as NotationGroup).Notations[0].IsSelected = true; //ERROR 4
            }

            ...
        }
    }
}

(НЕКОТОРЫЕ КОДЫ ОБРЕЗАНЫ ДЛЯ ЯСНОСТИ)

Это сообщения об ошибках:

ОШИБКА 1

Тип «System.Collections.ObjectModel.ObservableCollection`1» определен в сборке, на которую нет ссылок. Вы должны добавить ссылку на сборку «System.Windows, версия = 2.0.5.0, культура = нейтральная, PublicKeyToken = 7cec85d7bea7798e, Retargetable = Yes».

При ОШИБКЕ 1 я пытался использовать как for, так и foreach, но это одно и то же.

ОШИБКА 2

Оператор «‹» нельзя применять к операндам типа «int» и «группа методов».

ОШИБКА 3

Невозможно применить индексирование с [] к выражению типа «System.Collections.ObjectModel.ObservableCollection`1»

ОШИБКА 4

Невозможно применить индексирование с [] к выражению типа «System.Collections.ObjectModel.ObservableCollection`1»

Я тоже добавил System.Windows, но это не помогло.

Есть идеи? Спасибо.


person Moses Aprico    schedule 03.07.2014    source источник
comment
Оба класса находятся в одной сборке? На какую платформу .NET вы ориентируетесь? (Если .NET framework ‹ 4, есть ли у вас WindowsBase в списке ссылок на проекты?)   -  person    schedule 03.07.2014
comment
NotationGroup находится в библиотеке классов. И оба они .NET Framework 4.5.   -  person Moses Aprico    schedule 03.07.2014


Ответы (1)


Все, что вам нужно сделать, это скопировать и вставить эти ошибки в любую поисковую систему, чтобы быстро и легко найти ответы. Однако, поскольку вместо этого вы вставили их сюда, я сделаю вашу работу за вас:

Невозможно применить индексирование с [] к выражению типа «System.Collections.ObjectModel.ObservableCollection`1»

Это на самом деле означает именно то, что написано... вы не можете использовать индексацию для ObservableCollection. Так где ты это сделал? Ошибка даже говорит вам, где:

item.Notations[i].Note = note;

а также

(selectedNG as NotationGroup).Notations[0].IsSelected = true;

Решение? если бы вы искали в Интернете, вы бы узнали, что мы используем метод ElementAt для доступа к элементам с помощью LinQ:

item.Notations.ElementAt(i).Note = note;

а также

(selectedNG as NotationGroup).Notations.ElementAt(0).IsSelected = true;

Конечно, это все равно взорвется, если i находится за пределами диапазона соответствующей коллекции. Следующий:

Оператор «‹» нельзя применять к операндам типа «int» и «группа методов».

Вы говорите, что это произошло в этой строке, но я не понимаю, как... это больше похоже на последнюю ошибку:

если (item.Notations[i].IsSelected)

Возможно, вам придется просто поискать его в Интернете. Наконец, у нас есть простая справочная задача:

Тип «System.Collections.ObjectModel.ObservableCollection`1» определен в сборке, на которую нет ссылок. Вы должны добавить ссылку на сборку «System.Windows, версия = 2.0.5.0, культура = нейтральная, PublicKeyToken = 7cec85d7bea7798e, Retargetable = Yes».

Опять же, очень очевидная и очевидная ошибка... ObservableCollection определен в сборке, на которую нет ссылок. Вы должны добавить ссылку на сборку System.Windows. Исправление? Просто сделайте то, что он говорит... добавьте ссылку на System.Windows dll в свой проект.

person Sheridan    schedule 03.07.2014
comment
Последнее уже указано в моем ОП. Я также добавил System.Windows, но это не помогло. - person Moses Aprico; 03.07.2014
comment
Эта ошибка ясна. Это решение этой ошибки. - person Sheridan; 03.07.2014
comment
О, кажется, я просто добавил using System.Windows без ссылки на сборку. Спасибо. - person Moses Aprico; 03.07.2014