【问题标题】:How to get an element at a specific index in an ObservableCollection如何获取 ObservableCollection 中特定索引处的元素
【发布时间】:2012-09-23 03:22:56
【问题描述】:

我正在尝试制作一个选项卡式浏览器代码示例,但我无法正确实现解决方案。我创建了一个自定义类BrowserItem,它有两个值,我的自定义 Web 浏览器和一个 url 字符串。然后,我创建了一个 BrowserItem 类型的 ObservableCollection,在其中我在单击事件时将新项目添加到 ObservableCollection。但是由于某种原因,当我在 MainPage 中调用 ShowTab 方法以显示用户选择的 Web 浏览器实例(从由 ObservableCollection 填充的 ListBox 中)时,我得到了 ArgumentOutOfRange 异常。为了说明,我到目前为止的内容如下:

BrowserItem.cs

public FullWebBrowser browser
    {
        get;
        set;
    }

    public string url
    {
        get;
        set;
    }  

Settings.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 方法中,以及包含相同语句的其他任何地方。我只想在 MainPage 的 ObservableCollection 中显示相应索引值的浏览器。

【问题讨论】:

  • 您必须接受以前回答的问题,这可以帮助正在搜索类似问题的其他受众。
  • 你检查过传递的索引的值和集合的大小吗?
  • 是的,我只是注意到初始化时没有填充集合,所以我调整了上面的解决方案。但是,当检查 if (Settings.Browsers.Value.ElementAt(currentIndex) == null) 行的 ShowTab 中的某个索引是否为空时,我仍然收到 ArguementOutOfRange 异常。允许用户在另一个页面的点击事件上添加一个项目,我将新创建的集合索引值传递给我的 MainPage,从那里我必须检查该索引值是否包含 BrowserItem,如果不加一个。

标签: c# windows-phone-7 observablecollection


【解决方案1】:

您需要从某个地方以某种方式将项目添加到集合中。应该有一些类似的代码

 Settings.Browsers.Value.Add(browserItemInstanceHere);

 Settings.Browsers.Value = getSomeBrowserCollections();

您无法从空集合中获取项目,并且您的索引不得大于 Count-1

【讨论】:

  • 好的,我刚刚编辑了关于 ShowTab 方法的解决方案,首先检查集合是否为空,如果是则添加新项目。这样可行。但是,之后,如果用户希望从另一个页面将新的 BrowserItem 添加到集合中,我想检查该集合的相应索引是否为空,如果是,我必须向其中添加另一个 BrowserItem,然后将其显示给用户。在线if (Settings.Browsers.Value.ElementAt(currentIndex) == null) 我如何更改它以检查这里的集合是否为空(我仍然得到 ArgumentOutOfRange 异常)?
  • 添加项目和显示标签的代码需要不同。显示选项卡应该只显示请求的选项卡。如果索引不在集合中,则忽略并退出该函数。 if(index &gt; count || index &lt; 0) return;
  • 另外,用户从中选择的列表应该从您的收藏中提供,以便项目的数量与您的收藏的大小相同。这样用户就不会选择不在集合中的索引。
  • 好吧,有道理,我会尽量改变我的解决方案。我仍然有一个关于如何检查 ObservableCollection 中的某个索引值是否为空的问题?
  • 你不能,除非你把 null 放在那里。例如。 for(int i=0;i&lt;5;i++) values.Add(null); 通过将每个位置初始化为空。但这没有意义。如果您没有向该位置添加任何对象,则它不存在。 Add 方法是增量的,从 0,1,2... 开始,正如您所说的那样。它不能跳转一个位置。
猜你喜欢
  • 2013-05-24
  • 1970-01-01
  • 2014-03-09
  • 2015-04-05
  • 1970-01-01
  • 2015-09-04
  • 2018-05-02
  • 2021-08-15
  • 1970-01-01
相关资源
最近更新 更多