设置ItemsSource属性时,Windows运行时GridView会抛出ArgumentException

时间:2013-12-25 17:37:45

标签: c# xaml gridview data-binding windows-runtime

我正在为我正在制作的RageComic读者地铁风格应用程序提供以下两个类。

public class ComicDataWNGroup
{
    public ComicDataWNGroup(string title)
    {
        this.Title = title;
        this.Items = new ObservableCollection<ComicDataItem>();
    }

    public String Title { get; set; }

    public ObservableCollection<ComicDataItem> Items { get; private set; }
}

public class ComicDataWNSource
{
    private RedditAPI.RedditManager currentManager;

    public ComicDataWNSource(RedditAPI.RedditManager currentManager)
    {
        this.currentManager = currentManager;
        Groups = new ObservableCollection<ComicDataWNGroup>();
    }

    public async Task<int> ObtainRecentContent()
    {
        SubredditComicDataSource comicList = new SubredditComicDataSource();
        await comicList.LoadItems();
        var comicSources = comicList.GetAllItems();

        for (int i = 0; i < comicSources.Count; i++ )
        {
            var links = await this.currentManager.GetSubredditLinks(comicSources[i].UrlTitle, 6, 0);
            ComicDataWNGroup group = new ComicDataWNGroup("From " + comicSources[i].Title);
            for(int j = 0; j < links.Data.Count; j++)
            {
                var linkItem = (RedditAPI.Objects.Link)links.Data[j];
                BitmapImage img = await ThumbnailRetriever.GetThumbnailFromRedditUrl(linkItem.ThumbnailUrl);
                ComicDataItem item = new ComicDataItem(linkItem.Title, false, true, 0, img, 0, null, null, Visibility.Visible, Visibility.Collapsed);
                group.Items.Add(item);
            }
            Groups.Add(group);
        }

        return 0;
    }

    public ObservableCollection<ComicDataWNGroup> Groups
    {
        { get; private set; }
    }
}

注意:ComicDataItem是一个主要包含get set属性的类。如果需要,我可以稍后发布。

使用这两个类,我试图将ComicDataWNSource对象的Groups属性绑定到GridView。

以下代码是我用于绑定的代码。

DataModel.ComicDataWNSource source = new DataModel.ComicDataWNSource(App.Manager);
await source.ObtainRecentContent();

CollectionViewSource viewSource = new CollectionViewSource();
viewSource.Source = source.Groups;
viewSource.IsSourceGrouped = true;
viewSource.ItemsPath = new PropertyPath("Items");

this.itemGridView.ItemsSource = viewSource;

GridView是Visual Studio在创建新的Grouped Items页面时生成的默认值。我已经更改了适当的绑定以匹配ComicDataWNGroup类和ComicDataItem类中的属性(如果需要,我也可以为GridView发布XAML)。此外,source.ObtainRecentContent()当前正在使用正确的数据填充Groups数组。组的数组和项的内部数组都包含对象,并且它们都不为空。

在将视图源设置为网格视图的行上出现问题。每当我尝试它时,它会引发以下异常:

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

我不知道我为此做错了什么。我已经查看了this msdn页面,它向您展示了如何使用分组的网格视图项和查看源代码。我有什么想法吗?

1 个答案:

答案 0 :(得分:0)

好的,我通过以下方式成功完成了这项工作:

在定义了GridView的xaml中,我将CollectionViewSource声明为相同的xaml文件而不是代码隐藏文件。

<Page.Resources>
    <CollectionViewSource x:Name="itemsViewSource" ></CollectionViewSource>
</Page.Resources>

我使用以下属性绑定GridView的ItemsSource属性:

<GridView
    x:Name="itemGridView"
    ItemsSource="{Binding Source={StaticResource itemsViewSource}}"
</GridView>

在后面的代码中,我将代码更改为以下内容:

DataModel.ComicDataWNSource source = new DataModel.ComicDataWNSource(App.Manager);
await source.ObtainRecentContent();

itemsViewSource.Source = source.Groups;
itemsViewSource.IsSourceGrouped = true;
this.itemsViewSource.ItemsPath = new PropertyPath("Items");

通过进行这些更改,代码可以正常工作。我现在确定我做错的是ItemsSource需要一个指向CollectionViewSource对象的Binding对象,而不是实际的CollectionViewSource对象。