繁体   English   中英

参数异常:值未在预期范围内

[英]Argument Exception:Value does not fall in the expected range

当我从ObservableCollection删除项目时,删除一定数量的项目后,我收到一个Argument Exception,说“值未在预期范围内”。

这是代码:

public abstract class BaseList<T> : ObservableCollection<T>
{

}

public class Videos
{
   //Contains members and methods
}

public class VideoList:BaseList<Videos>
{
   //Contains members and methods
}


//Singleton class
public class VideoPlaylist
{
    private static VideoPlaylist _instance;
    public static VideoPlaylist Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new VideoPlaylist();
            }
            return _instance;
        }
    }

    private VideoList _myPlaylist = new VideoList();
    public VideoList MyPlaylist
    {
        get { return _myPlaylist; }
        set
        {
            if (_myPlaylist != value)
            {
                _myPlaylist = value;
            }
        }
    }
   public void RemoveFromPlayList(string id)
   {
        if (MyPlaylist != null)
        {
            for (int index = MyPlaylist.Count - 1; index >= 0; index--)
            {
                Videos video = MyPlaylist.ElementAt(index);
                if (video.Id == id)
                {
                    MyPlaylist.RemoveAt(index);
                }
            }
        }
    }

}

XAML:

<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Name="VideoItemListTemplate">
        <Grid MinHeight="100"
              Margin="0,0">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>

            <!--Content-->
            <Grid Grid.Row="0">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>

                <!--Image-->
                <Grid Grid.Column="0">
                    <Image Stretch="UniformToFill"
                           Grid.Column="0"
                           Height="150"
                           Width="150">
                        <Image.Source>
                            <BitmapImage UriSource="{Binding Image}"
                                         CreateOptions="BackgroundCreation" />
                        </Image.Source>
                    </Image>


                </Grid>

                <!--Description and Publish Date-->
                <StackPanel 
                            Grid.Column="1">

                    <TextBlock Text="{Binding Title}"
                               TextAlignment="Left"
                               TextWrapping="Wrap"
                               MaxHeight="100"
                               Margin="12,0,0,0"
                               FontSize="30"
                               Style="{StaticResource RangeelaTextBlockStyle}"                                   
                               TextTrimming="WordEllipsis"
                               VerticalAlignment="Top" />

                    <Button Content="Remove" Foreground="#bd8326" 
                            BorderBrush="#bd8326" Click="Remove_Clicked" 
                            FontWeight="Thin" FontSize="25"
                            BorderThickness="0.8"/>

                </StackPanel>
            </Grid>

            <!--Line Seperator-->
            <!--<Rectangle Grid.Row="1" Height="1"
                       Stroke="White"
                       StrokeThickness="0.6" Opacity="0.4"
                       Margin="0,12" />-->

        </Grid>
    </DataTemplate>
</phone:PhoneApplicationPage.Resources>
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <TextBlock HorizontalAlignment="Center"
                   VerticalAlignment="Center"
                   Foreground="White"
                   x:Name="EmptyPlaylistMessage"
                   Text="Playlist is empty" 
                   Visibility="Collapsed"/>

        <ProgressBar x:Name="MyProgressBar"
                     Visibility="Collapsed"
                     IsIndeterminate="False" />

        <phone:LongListSelector x:Name="LatestVideoPivotItem"
                                LayoutMode="List"
                                GridCellSize="210,250"
                                Margin="12,12,12,0"
                                Tap="Videos_Tapped"
                                ItemTemplate="{StaticResource  VideoItemListTemplate}"
                                ItemsSource="{Binding}"/>
    </Grid>

MainPage上的方法RemoveClicked:

private void Remove_Clicked(object sender, RoutedEventArgs e)
    {
        Button image = sender as Button;
        Videos video = image.DataContext as Videos;
        _IsAddToPlaylistSelected = true;
        if (video != null)
        {
                VideoPlaylist.Instance.RemoveFromPlayList(video.Id);               
        }        
    }

在主页上,我使用Singleton类的实例并尝试删除这些项目。

我用ListBox替换了LongListSelector。 有效..

如果要从Collection删除某些元素,请确保您不在同一元素上进行iterating ,这是在这里发生的。

        for (int index = MyPlaylist.Count - 1; index >= 0; index--)
        {
            Videos video = MyPlaylist.ElementAt(index);
            if (video.Id == id)
            {
                MyPlaylist.RemoveAt(index);
            }
        }

MyPlaylist.Count会随着删除的每个元素而不断变化,因此可能抛出Value does not fall in the expected range例外中。

像这样做

        int totalitems = MyPlaylist.Count;
        List<Videos> l = new List<Videos>();

        for (int index = totalitems - 1; index >= 0; index--)
        {
            Videos video = MyPlaylist.ElementAt(index);
            if (video.Id == id)
            {
                l.Add(video);
            }
        }

现在删除项目

            foreach(Videos v in l)
            {
               if(MyPlaylist.Contains(v))
               {
                   MyPlaylist.Remove(v);
               }
            }

            l.Clear();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM