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

时间:2015-01-22 20:42:12

标签: c# windows xaml data-binding windows-store-apps

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

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

<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项目。就像我说的那样,一切似乎都在工作中,每个列中都显示了项目,然后在它们之间点击会更新相应的列。

    <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路径错误:&#39;类型&#39;未在&#39; Windows.UI.Xaml.Data.ICollectionView&#39;上找到的属性。 BindingExpression:Path =&#39; Types&#39;的DataItem =&#39; Windows.UI.Xaml.Data.ICollectionView&#39 ;;目标元素是&#39; Windows.UI.Xaml.Data.CollectionViewSource&#39; (名称=&#39;空&#39);目标财产是来源&#39; (键入&#39;对象&#39;) 错误:BindingExpression路径错误:&#39;产品&#39;未在&#39; Windows.UI.Xaml.Data.ICollectionView&#39;上找到的属性。 BindingExpression:Path =&#39; Products&#39;的DataItem =&#39; Windows.UI.Xaml.Data.ICollectionView&#39 ;;目标元素是&#39; Windows.UI.Xaml.Data.CollectionViewSource&#39; (名称=&#39;空&#39);目标财产是来源&#39; (键入&#39;对象&#39;) 错误:BindingExpression路径错误:&#39; name&#39;未在&#39; Windows.UI.Xaml.Data.ICollectionView&#39;上找到的属性。 BindingExpression:Path =&#39; name&#39;的DataItem =&#39; Windows.UI.Xaml.Data.ICollectionView&#39 ;;目标元素是&#39; Windows.UI.Xaml.Controls.TextBlock&#39; (名称=&#39;空&#39);目标属性是&#39; Text&#39; (键入&#39; String&#39;) 错误:BindingExpression路径错误:&#39;标题&#39;未在&#39; Windows.UI.Xaml.Data.ICollectionView&#39;上找到的属性。 BindingExpression:Path =&#39; Title&#39;的DataItem =&#39; Windows.UI.Xaml.Data.ICollectionView&#39 ;;目标元素是&#39; Windows.UI.Xaml.Controls.TextBlock&#39; (名称=&#39;空&#39);目标属性是&#39; Text&#39; (键入&#39; String&#39;)

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

2 个答案:

答案 0 :(得分:1)

我能够重现&#34;错误&#34;按照提供的网站上的确切教程。众所周知,在处理XAML时,您可能会遇到不合理的错误,实际上并非真正的错误。它可能是VS中的一个错误,它可能是正在加载的控件/资源的顺序等等。简而言之,如果一切按预期方式运行,并且您看到绑定错误,请不要担心。事实上,用鼠标/键盘测试UI,如果UI看起来坏了,那么会看输出窗口。

我确实尝试了一些事情,看看我是否可以彻底摆脱错误,但这并没有及时发生。简而言之,我要说避免使用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:你没有做错任何事。微软的例子没有&#34;工作&#34;无论是。

答案 1 :(得分:0)

您要绑定的Types中没有ProductsCollectionViewSource个属性。