绑定和链接多个 CollectionViewSource 显示项目但导致绑定错误

Binding and chaining multiple CollectionViewSource displaying items but causing binding errors

我的数据绑定似乎显示了项目,但它导致输出日志中出现绑定错误,所以它似乎是错误的。我在这里基于 Microsoft 示例:https://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh758322.aspx

我将集合视图作为页面资源,最初的一个,GroupCV 绑定了页面 DataContext(视图模型)的组 属性,并且似乎没有给出任何错误。

<Page.Resources>
    <!-- Collection of items displayed by this page -->
    <CollectionViewSource 
        x:Name="GroupsCV"
        Source="{Binding Groups}"/>

    <CollectionViewSource 
        x:Name="TypesCV"
        Source="{Binding Types, Source={StaticResource GroupsCV}}" />

    <CollectionViewSource 
        x:Name="ProductsCV"
        Source="{Binding Products, Source={StaticResource TypesCV}}" />

</Page.Resources>   

这是我要绑定的 UI 项。就像我说的,一切似乎 'work',项目显示在每一列中并在它们之间单击更新相应的列。

    <Grid x:Name="PopupChildInner"
                      Margin="20"
                  >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="0.3*" />
                        <ColumnDefinition Width="0.3*" />
                        <ColumnDefinition Width="0.3*" />
                    </Grid.ColumnDefinitions>

                    <!-- All Groups -->
                    <StackPanel Margin="5" Grid.Column="0">
                        <TextBlock Text="Product Categories"/>
                        <ListBox ItemsSource="{Binding Source={StaticResource GroupsCV}}" 
                            DisplayMemberPath="Title"/>
                    </StackPanel>

                    <!-- All Types -->
                    <StackPanel Margin="5" Grid.Column="1">
                        <TextBlock Text="{Binding Title, Source={StaticResource GroupsCV}}"/>
                        <ListBox ItemsSource="{Binding Source={StaticResource TypesCV}}" 
                            DisplayMemberPath="name"/>
                    </StackPanel>

                    <!-- Items -->
                    <Grid Margin="5" Grid.Column="2">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>
                        <TextBlock Text="{Binding name, Source={StaticResource TypesCV}}"/>
                        <ListBox x:Name="PopupProductList" 
                                 ItemsSource="{Binding Source={StaticResource ProductsCV}}" 
                                 SelectionMode="Multiple"
                                 Grid.Row="1"
                                 >
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <!-- Product item -->
                                    <Grid>
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto" />
                                            <RowDefinition Height="*" />
                                        </Grid.RowDefinitions>
                                        <TextBlock Text="{Binding name}" />
                                        <!--List of PDF items-->
                                        <ListBox x:Name="PopupProductPDFList" 
                                                 Grid.Row="1" 
                                                 DisplayMemberPath="Name"
                                                 ItemsSource="{Binding PDFItems}">
                                        </ListBox>
                                    </Grid>
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>
                    </Grid>

但是,我遇到了这些错误:

错误:BindingExpression 路径错误:在 'Windows.UI.Xaml.Data.ICollectionView' 上找不到 'Types' 属性。绑定表达式:路径='Types' 数据项='Windows.UI.Xaml.Data.ICollectionView';目标元素是 'Windows.UI.Xaml.Data.CollectionViewSource' (Name='null');目标 属性 是 'Source'(类型 'Object') 错误:BindingExpression 路径错误:在 'Windows.UI.Xaml.Data.ICollectionView' 上找不到 'Products' 属性。 BindingExpression: Path='Products' DataItem='Windows.UI.Xaml.Data.ICollectionView';目标元素是 'Windows.UI.Xaml.Data.CollectionViewSource' (Name='null');目标 属性 是 'Source'(类型 'Object') 错误:BindingExpression 路径错误:在 'Windows.UI.Xaml.Data.ICollectionView' 上找不到 'name' 属性。 BindingExpression: Path='name' DataItem='Windows.UI.Xaml.Data.ICollectionView';目标元素是 'Windows.UI.Xaml.Controls.TextBlock' (Name='null');目标 属性 是 'Text'(类型 'String') 错误:BindingExpression 路径错误:在 'Windows.UI.Xaml.Data.ICollectionView' 上找不到 'Title' 属性。 BindingExpression: Path='Title' DataItem='Windows.UI.Xaml.Data.ICollectionView';目标元素是 'Windows.UI.Xaml.Controls.TextBlock' (Name='null');目标 属性 是 'Text'(类型 'String')

任何人都可以向我解释我在这里做错了什么吗?我知道它似乎正在寻找不存在的集合视图上的 属性,但是 MS 样本是如何工作的,为什么大多数情况下都是 "working"?我可能在这里遗漏了一些基本的东西...

在按照网站提供的确切教程进行操作后,我能够重现 "errors"。众所周知,在处理 XAML 时,您可能会遇到没有意义的错误,而实际上这并不是真正的错误。这可能是 VS 中的错误,可能是 controls/resources 的加载顺序等。简而言之,如果一切都按您预期的方式进行,并且您看到了绑定错误,请不要担心。事实上,用 mouse/keyboard 测试 UI,如果 UI 看起来坏了,THEN 查看输出 window.

我确实尝试了一些方法,看看是否可以完全消除错误,但没有及时发生。简而言之,我会说避免使用 XAML 创建静态数据并确保您使用 MVVM 方法并实现 INotifyPropertyChanged。我这样说是因为您只会收到试图绑定到 StaticResource 成员的项目的错误;当然,我认为您的静态数据应该在 ViewModel 或 Model 域中生成。

在您链接的示例中,我能够通过以这种方式更改 ContentControl 来消除一些错误:

<ContentControl Content="{Binding Source={StaticResource Teams}}">
<ContentControl.Template>
    <ControlTemplate>
        <StackPanel Margin="5">
            <TextBlock Text="{Binding Name}"
                       FontSize="15"
                       FontWeight="Bold" />
            <StackPanel Orientation="Horizontal"
                        Margin="10,10">
                <TextBlock Text="Wins:"
                           Margin="0,0,5,0" />
                <TextBlock Text="{Binding Wins}" />
            </StackPanel>
            <StackPanel Orientation="Horizontal"
                        Margin="10,0">
                <TextBlock Text="Losses:"
                           Margin="0,0,5,0" />
                <TextBlock Text="{Binding Losses}" />
            </StackPanel>
        </StackPanel>
    </ControlTemplate>
</ContentControl.Template>

TL;DR: 你没有做错任何事。 Microsoft 的示例也没有 "work"。

CollectionViewSource 中没有您要绑定的 TypesProducts 属性。