【问题标题】:CollectionViewSource "Value does not fall within the expected range."CollectionViewSource “值不在预期范围内。”
【发布时间】:2013-07-16 17:01:08
【问题描述】:

为什么此代码会在 Windows 8 XAML 应用程序中产生错误?

值不在预期范围内。

XAML:

    <SemanticZoom>
        <SemanticZoom.ZoomedInView>
            <ListView
                Style="{StaticResource HorizontalListViewStyle}"
                SelectionMode="None"
                ScrollViewer.IsHorizontalScrollChainingEnabled="False"
                ItemsSource="{Binding BoardItems}" 
                ItemContainerStyle="{StaticResource ZoomedOutListViewItemContainerStyle}"
...

MVVM 代码:

ObservableCollection<WritingBoardModel> boards = new ObservableCollection<WritingBoardModel>();

... // Add item models to boards.

CollectionViewSource v = new CollectionViewSource()
{
    Source = boards,
};

this.ViewModel.Add(BoardItemsViewModelKey, v);

如果我跳过CollectionViewSource 并直接将boards 实例添加到我的视图模型中,那么一切正常。

我想我需要使用 CollectionViewSource 才能使某些语义缩放选择行为起作用。

【问题讨论】:

    标签: xaml windows-store-apps winrt-xaml


    【解决方案1】:

    所以,CollectionViewSources 很奇怪,而且你必须绑定到它们的方式也很奇怪。举个例子,为了“按本书”(示例项目的方式)来做,我发现它实际上必须是StaticResource

    <Page.Resource>
        <CollectionViewSource Source="{Binding Whatev}"
                              x:Key="WhatevSource"/>
    </Page.Resource>
    
    <GridView ItemsSource="{Binding Source={StaticResource WhatevSource}}"/>
    

    请注意,我们没有将源直接设置为CollectionViewSource,而是设置了“无路径”Binding,基本上将CollectionViewSource 用作DataContext(只是一种思考方式它,实际上在技术上并不正确)。

    这是我能够让它工作的唯一方法,尽管我相信您可以在代码隐藏中技术上将ItemsSource 直接设置为CollectionViewSource 的视图或类似的东西。

    【讨论】:

    • 感谢您的回答。不幸的是,这样做会产生同样的错误,尽管在 XAML 编辑器中显示为蓝色波浪线。
    • XAML 编辑器说什么错误?您能否发布现在给您蓝色波浪线的代码以及您的 Xaml CollectionViewSource 声明?
    • 这样做对我有用: 我在绑定它时没有提及 Source.. 感觉很奇怪..但它解决了这个问题..
    【解决方案2】:

    在您的列表视图中添加“StaticResource”和“Source”

    <ListView ItemsSource="{Binding Source={StaticResource WhatevSource}}"/>
    

    【讨论】:

      【解决方案3】:

      我需要像这样绑定到 CollectionViewSource 的 View 属性:

      CollectionViewSource v = new CollectionViewSource()
              {
                  IsSourceGrouped = false,
                  Source = boards,
              };
      
      this.ViewModel.Add(BoardItemsViewModelKey, v.View);
      

      请注意,这对我的两个 ListViews 并在 SemanticZoom 中保持选择同步无济于事。

      【讨论】:

      • 如果您尝试在 XAML 绑定中绑定到 CollectionViewSource,则将 .View 添加到绑定中也同样有效。
      猜你喜欢
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多