Bound Observable Collection的GeneratorPosition错误

时间:2012-02-17 15:09:50

标签: c# wpf observablecollection itemsource

我正在使用Transitionals幻灯片控件,该控件具有绑定到itemsource的可观察字符串集合。这些字符串是幻灯片中每个图片的文件路径。当我第一次加载WPF应用程序时,它正确运行此方法(使用目录路径生成PicSlideShowCollection):

public void SelectImages(string path)
    {
        // Validate
        if (string.IsNullOrEmpty(path)) throw new ArgumentException("path");

        PicSlideShowCollection.Clear();          


        // Get directory info for specified path
        DirectoryInfo di = new DirectoryInfo(path);

        // Image mask
        string[] extensions = new string[] { "*.jpg", "*.png", "*.gif", "*.bmp" };

        // Search for all
        foreach (string extension in extensions)
        {
            foreach (FileInfo fi in di.GetFiles(extension.ToLower()))
            {
                PicSlideShowCollection.Add(fi.FullName);                    
            }
        }           
    }

但是,我有一个按钮,允许用户更改幻灯片中使用的图像目录并重新运行上述方法。当执行该操作时,我收到此错误:

  

传递给Remove的GeneratorPosition'-1,1'没有Offset相等   到0。

这发生在PicSlideShowCollection.Clear()指令上。 如果我评论该指令,新目录图像会添加到原始目录图片中,这不是我想要的。

我知道这与将PicSlideShowCollection用作幻灯片放映控件的项目源有关,但我需要知道如何防止出现此错误。

谢谢!

2 个答案:

答案 0 :(得分:1)

Slideshow.AutoAdvance = false;

Slideshow.SelcetedIndex=-1;

var count=PicSlideShowCollection.Count;

forearch(var item in newsources)
{
 PicSlideShowCollection.Add(item);
}

while(count--)
 PicSlideShowCollection.RemoveAt(0);

Slideshow.SelcetedIndex=0;

答案 1 :(得分:0)

我无法解释为什么会出现此错误。 GeneratorPosition由ItemsControl的ItemContainerGenerator使用,当您绑定到其ItemsSource属性并向源集合添加项目或从源集合中删除项目时,它应该可以正常工作。清除源集合当然也是一种有效的操作。

问题的可能解决方法是每次切换到另一个图像目录时重置ItemsSource。因此,而不是清除现有的集合

PicSlideShowCollection.Clear();

创建一个新集合并将ItemsSource设置为新集合:

PicSlideShowCollection = new ObservableCollection<string>();
slideShowControl.ItemsSource = PicSlideShowCollection;