参考此示例:
(一些相关代码段:)
<Window.Resources>
<local:People x:Key="MyFriends"></local:People>
<DataTemplate x:Key="DetailTemplate">
<Border Width="300" Height="100" Margin="20"
BorderBrush="Aqua" BorderThickness="1" Padding="8">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="First Name:"/>
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=FirstName}"/>
<TextBlock Grid.Row="1" Grid.Column="0" Text="Last Name:"/>
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=LastName}"/>
<TextBlock Grid.Row="2" Grid.Column="0" Text="Home Town:"/>
<TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Path=HomeTown}"/>
</Grid>
</Border>
</DataTemplate>
</Window.Resources>
<ListBox Width="200" IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Source={StaticResource MyFriends}}"/>
<ContentControl x:Name="contentControl1"
Content="{Binding Source={StaticResource MyFriends}}"
ContentTemplate="{StaticResource DetailTemplate}" />
ListBox.ItemsSource
和ContentControl.Content
都绑定到相同的源(MyFriends
,这是从ObservableCollection<Person>
派生的People类的实例)。如果我的理解是正确的,则意味着ListBox.ItemsSource
和ContentControl.Content
属性都将绑定到ListCollectionView
的相同隐式创建的实例。
我了解到,设置ListBox.IsSynchronizedWithCurrentItem="True"
会同步ListBox.SelectedItem
和ItemCollection.CurrentItem
。
DetailTemplate
(上方)显示所选ListBox
项的详细信息,尽管已“绑定”到ListCollectionView。指定Path=/
(我认为要实现所得到的行为是必需的)没有任何效果-好像WPF知道以某种方式隐式地做到这一点:
<ContentControl x:Name="contentControl1"
Content="{Binding Source={StaticResource MyFriends}, Path=/}"
ContentTemplate="{StaticResource DetailTemplate}" />
作为测试,我创建了另一个ContentControl
,其中Content
绑定到包含DataTemplate
的{{1}}:
ListBox
它显示了列表。
我的问题是:为什么<ContentControl x:Name="contentControl2"
Content="{Binding Source={StaticResource MyFriends}}"
ContentTemplate="{StaticResource DetailTemplate2}" />
<DataTemplate x:Key="DetailTemplate2">
<ListBox ItemsSource="{Binding}"></>
</DataTemplate>
获取选定的DataTemplate
对象而Person
和ListBox
获取DetailTemplate2
集合?
(这种行为是可取的,我只是不明白引擎盖下发生了什么黑魔法)
答案 0 :(得分:1)
是个好问题!直到阅读您的帖子,我才注意到这一点。因此,从PropertyPathWorker
的源代码中进行了一些挖掘之后,似乎发现PropertyPathWorker
未能解决对象的成员时,在您的情况下,它将尝试解决“ FirstName”,“ LastName”等问题。 。使用“ MyFriends”时,它将尝试使用对象的视图来解决它。如果仍然失败,它将尝试使用视图的CurrentItem
解决问题,这就是魔术发生的地方。您可以在PropertyPathWorker.UpdateSourceValueState(int k, ICollectionView collectionView, object newValue, bool isASubPropertyChange)
和PropertyPathWorker.ReplaceItem(int k, object newO, object parent)
中找到这些代码。