绑定和链接多个 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
中没有您要绑定的 Types
或 Products
属性。
我的数据绑定似乎显示了项目,但它导致输出日志中出现绑定错误,所以它似乎是错误的。我在这里基于 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
中没有您要绑定的 Types
或 Products
属性。