【问题标题】:CollectionViewSource can't be DataBound in XAML but can in CodeBehind?CollectionViewSource 在 XAML 中不能是 DataBound 但可以在 CodeBehind 中?
【发布时间】:2011-01-10 05:35:18
【问题描述】:

我希望这是有道理的。

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

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

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

有问题的 XAML 是这样的:

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

列表框:

<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 配置数据绑定。

【问题讨论】:

    标签: c# data-binding windows-phone-7 silverlight-3.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,但我还没有尝试过。

    【讨论】:

      【解决方案2】:

      在我的情况下,最好的办法就是简单地在代码后面对 ItemCollection 进行排序,甚至不用理会 CollectionViewSource。

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

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

      【讨论】:

        【解决方案3】:

        页面中有多少“ItemsSort”资源的其他客户端。在我看来,它对资源字典中的某些内容进行绑定总是看起来有点笨拙。

        试试这个:-

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

        【讨论】:

        • 感谢您的建议。我试过了,IDE 告诉我 CollectionViewSource 在 ListBox.ItemsSource 中无效
        【解决方案4】:

        明确一点: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)
        

        【讨论】:

        猜你喜欢
        • 2020-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-30
        • 1970-01-01
        相关资源
        最近更新 更多