CollectionViewSource不能是XAML中的DataBound,但可以在CodeBehind中吗?

时间:2011-01-10 05:35:18

标签: c# data-binding windows-phone-7 silverlight-3.0

我希望这是有道理的。

我有一个使用Windows Phone数据绑定应用程序模板的Windows Phone 7应用程序。

我需要对绑定到ViewModel的ListBox进行排序,因此我在XAML中创建了一个CollectionViewSource,并将ListBox ItemSource设置为CollectionViewSource。在Designer中,一切都很好,我可以看到SampleData很棒。但是,当我运行应用程序时,会抛出异常:

System.Windows.Markup.XamlParseException未处理   消息= AG_E_PARSER_BAD_PROPERTY_VALUE [行:33位置:31]   LineNumber上= 33   LinePosition = 31

有问题的XAML是:

<CollectionViewSource Source="{Binding Items}" x:Key="ItemsSort" >
    <CollectionViewSource.SortDescriptions>
        <compMod:SortDescription PropertyName="Order" Direction="Ascending"/>
    </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

ListBox:

<Grid>
    <ListBox x:Name="MainListBox" ItemsSource="{Binding Source={StaticResource ItemsSort}}">
        <ListBox.ItemTemplate>
            <DataTemplate>

现在,如果我从CollectionViewSource中删除Source =“{Binding Items}”,而是通过代码设置它:

CollectionViewSource itemsView = this.Resources["ItemsSort"] as CollectionViewSource;
itemsView.Source = App.ViewModel.Items;

一切都在运行时工作,但当然,我所拥有的样本数据并未在设计时出现。

我无法理解为什么会出现这种情况,我希望能够灵活地在设计时查看样本数据并使用XAML配置数据绑定。

4 个答案:

答案 0 :(得分:1)

我总是使我的CollectionViewSource成为视图模型的属性。我从来没有尝试过像你一样的静态资源,但是下面的提示可能对你有所帮助。

ListBox ItemsSource绑定应该设置为CollectionViewSource.View,而不是CollectionViewSource。

在你的视图模型中试试这个:

ItemsSort = new CollectionViewSource();
ItemsSort.Add(new System.ComponentModel.SortDescription("Order", System.ComponentModel.ListSortDirection.Ascending));
ItemsSort.Source = Items;

在你的XAML中尝试这个(注意绑定路径中的.View):

<ListBox x:Name="MainListBox" ItemsSource="{Binding Path={ItemsSort.View}}">

编辑:上面的提示是针对完整的Silverlight - 希望这也适用于Windows Phone,但我还没试过。

答案 1 :(得分:0)

就我而言,最好的办法就是在代码中对ItemCollection进行排序,而不是使用CollectionViewSource。

我找到了一个重新排序列表框类,它也会自动处理这个问题。

http://blogs.msdn.com/b/jasongin/archive/2011/01/03/wp7-reorderlistbox-improvements-rearrange-animations-and-more.aspx

答案 2 :(得分:-1)

页面中有“ItemsSort”资源的其他客户端数量。它将绑定放在资源字典中的某些内容对我来说总是有些松懈。

试试这个: -

<ListBox x:Name="MainListBox">
    <ListBox.ItemsSource>
        <CollectionViewSource Source="{Binding Items}">
            <CollectionViewSource.SortDescriptions>
                <compMod:SortDescription PropertyName="Order" Direction="Ascending"/>
            </CollectionViewSource.SortDescriptions>
        </CollectionViewSource> 
    </ListBox.ItemsSource>

答案 3 :(得分:-1)

为了清楚起见:Windows Phone不支持CollectionViewSource

http://msdn.microsoft.com/ru-ru/library/system.windows.data.collectionviewsource.sortdescriptions(v=vs.110).aspx

Platforms
Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core Role not supported), Windows Server 2008 R2 (Server Core Role supported with SP1 or later; Itanium not supported)