Как получить элемент по определенному индексу в ObservableCollection

Я пытаюсь сделать образец кода браузера с вкладками, но у меня возникают проблемы с правильным внедрением решения. Я создал собственный класс BrowserItem, который имеет два значения: мой собственный веб-браузер и строку URL. Затем я создал ObservableCollection типа BrowserItem, в котором я добавляю новые элементы в ObservableCollection по событию щелчка. Однако по какой-то причине, когда я вызываю свой метод ShowTab на моей главной странице, чтобы показать экземпляр веб-браузера, который выбирает пользователь (из ListBox, заполненного ObservableCollection), я получаю исключение ArgumentOutOfRange. Чтобы проиллюстрировать, то, что у меня есть до сих пор, выглядит следующим образом:

BrowserItem.cs

public FullWebBrowser browser
    {
        get;
        set;
    }

    public string url
    {
        get;
        set;
    }  

Настройки.cs

public static Setting<ObservableCollection<BrowserItem>> Browsers = new Setting<ObservableCollection<BrowserItem>>("Browsers", new ObservableCollection<BrowserItem>());

Где класс Setting выше сохраняет и получает ObservableCollection из изолированного хранилища.

MainPage.xaml.cs

private void ShowTab(int index) 
    {
        this.currentIndex = index;
        //Settings.Browsers.Value.ElementAt(currentIndex);  //ArgumentOutOfRange exception
        int count = Settings.Browsers.Value.Count;

        if (count <= 0)
        {                
            FullWebBrowser browser = new FullWebBrowser();
            browser.InitialUri = "http://www.bing.com";

            BrowserItem Browser = new BrowserItem();
            Browser.browser = browser;
            Browser.url = browser.InitialUri;
            Settings.Browsers.Value.Add(Browser);
            BrowserHost.Children.Add(Browser.browser);
        }

        //SearchBar.Text = Settings.Browsers.Value.ElementAt(currentIndex).url ?? "";

        if (Settings.Browsers.Value.ElementAt(currentIndex) == null)  //ArgumentOutOfRangeException
        {
            FullWebBrowser browser = new FullWebBrowser();
            browser.InitialUri = "http://www.bing.com";

            BrowserItem Browser = new BrowserItem();
            Browser.browser = browser;
            Browser.url = browser.InitialUri;
            Settings.Browsers.Value.Add(Browser);
            BrowserHost.Children.Add(Browser.browser);
        }

        for (int i = 0; i < Settings.Browsers.Value.Count; i++)
        {
            if (Settings.Browsers.Value.ElementAt(i) != null)
            {
                Settings.Browsers.Value.ElementAt(i).browser.Visibility = i == this.currentIndex ? Visibility.Visible : Visibility.Collapsed;
            }
        }
    }

Исключение ArgumentOutOfRangeException сначала возникает на Settings.Browsers.Value.ElementAt(currentIndex); в методе ShowTab и везде, где содержится один и тот же оператор. Я просто хотел бы показать веб-браузеру соответствующее значение индекса в ObservableCollection в MainPage.


person Matthew    schedule 23.09.2012    source источник
comment
Вы должны принять ранее отвеченные вопросы, которые могут помочь другой аудитории, которая ищет похожие вопросы.   -  person Shantanu Gupta    schedule 23.09.2012
comment
Вы проверили значение переданного индекса и размер коллекции?   -  person codingbiz    schedule 23.09.2012
comment
Да, я только что заметил, что коллекция не заполнялась при инициализации, поэтому я скорректировал свое решение выше. Однако я по-прежнему получаю исключение ArguementOutOfRange при проверке того, является ли определенный индекс нулевым в ShowTab в строке if (Settings.Browsers.Value.ElementAt(currentIndex) == null). Пользователю разрешено добавлять элемент в событие щелчка на другой странице, и я передаю вновь созданное значение индекса коллекции на мою главную страницу, и оттуда я должен проверить, содержит ли это значение индекса BrowserItem, и если не добавить ни одного.   -  person Matthew    schedule 23.09.2012


Ответы (1)


Нужно как-то откуда-то добавлять элементы в коллекцию. Должен быть какой-то код вроде

 Settings.Browsers.Value.Add(browserItemInstanceHere);

OR

 Settings.Browsers.Value = getSomeBrowserCollections();

Вы не можете получить элемент из пустой коллекции, и ваш индекс не должен превышать Count-1.

person codingbiz    schedule 23.09.2012
comment
Хорошо, я только что отредактировал свое решение относительно метода ShowTab, чтобы сначала проверить, пуста ли коллекция, и если да, то добавить новый элемент. Это работает. Однако впоследствии, если пользователь хочет добавить новый BrowserItem в коллекцию с другой страницы, я хочу проверить, является ли соответствующий индекс коллекции нулевым, и если да, я должен добавить к нему еще один BrowserItem, а затем показать это в Пользователь. В строке if (Settings.Browsers.Value.ElementAt(currentIndex) == null) как я могу изменить это, чтобы проверить, является ли коллекция здесь нулевой (я все еще получаю исключение ArgumentOutOfRange)? - person Matthew; 23.09.2012
comment
код для добавления элемента и отображения вкладки должен быть другим. Показать вкладку следует показывать только запрошенную вкладку. Если индекса нет в коллекции, просто проигнорируйте и выйдите из функции. if(index > count || index < 0) return; - person codingbiz; 23.09.2012
comment
Кроме того, список, из которого пользователи выбирают, должен быть получен из вашей коллекции, чтобы количество элементов совпадало с размером вашей коллекции. таким образом пользователь не выберет индекс, которого нет в коллекции. - person codingbiz; 23.09.2012
comment
Хорошо, это имеет смысл, я постараюсь изменить свое решение, когда смогу. У меня все еще есть вопрос о том, как проверить, является ли определенное значение индекса в ObservableCollection нулевым? - person Matthew; 23.09.2012
comment
Вы не можете, если вы не поместите туда null. Например. for(int i=0;i<5;i++) values.Add(null); Тем самым вы инициализировали каждое местоположение нулем. Но это не имеет смысла. Если вы ничего не добавляли в это место, оно не существует. Метод Add является инкрементным, начинается с 0,1,2... как вы его называете. Он не может перепрыгнуть через локацию. - person codingbiz; 23.09.2012
comment
Хорошо, спасибо за ваш совет. Я не был уверен, потому что сначала использовал массив, в котором я проверил, был ли индекс нулевым, а затем изменил его на ObservableCollection, поэтому я все еще проверял индекс на нулевое значение. - person Matthew; 23.09.2012
comment
Да, массив имеет фиксированный размер, поэтому они имеют значения по умолчанию, но коллекция имеет размер добавленных элементов. Таким образом, по умолчанию элементы не добавляются, а размер = 0. - person codingbiz; 23.09.2012