首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ContentControl和CollectionView.CurrentItem

ContentControl和CollectionView.CurrentItem
EN

Stack Overflow用户
提问于 2019-02-17 21:56:18
回答 1查看 149关注 0票数 2

引用此示例:

https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-bind-to-a-collection-and-display-information-based-on-selection

(一些相关的代码片段:)

代码语言:javascript
复制
<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.ItemsSourceContentControl.Content都绑定到相同的源(MyFriends,一个从ObservableCollection<Person>派生的People类的实例)。如果我的理解是正确的,这意味着ListBox.ItemsSourceContentControl.Content属性都将绑定到隐式创建的ListCollectionView实例。

我知道设置ListBox.IsSynchronizedWithCurrentItem="True"会同步ListBox.SelectedItemItemCollection.CurrentItem

DetailTemplate (如上)显示所选ListBox项的详细信息,尽管它已“绑定”到ListCollectionView。指定Path=/ (我认为这是实现结果行为所必需的)不会有任何效果-就好像WPF知道以某种方式隐式地执行它一样:

代码语言:javascript
复制
<ContentControl x:Name="contentControl1"
  Content="{Binding Source={StaticResource MyFriends}, Path=/}"
  ContentTemplate="{StaticResource DetailTemplate}" />

作为测试,我创建了另一个ContentControl,并将Content绑定到包含ListBoxDataTemplate

代码语言:javascript
复制
<ContentControl x:Name="contentControl2"
  Content="{Binding Source={StaticResource MyFriends}}"
  ContentTemplate="{StaticResource DetailTemplate2}" />

<DataTemplate x:Key="DetailTemplate2">
   <ListBox ItemsSource="{Binding}"></>
</DataTemplate>

它显示了列表。

我的问题是:为什么DataTemplate获取选定的Person对象,而ListBoxDetailTemplate2获取People集合?

(这种行为是可取的,我只是不明白在引擎盖下发生了什么黑魔法,为什么会这样)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-19 15:44:48

是一个很好的问题!直到读了你的帖子我才注意到这一点。所以,在对PropertyPathWorker的源代码做了一些挖掘之后,似乎当PropertyPathWorker无法解析一个对象的成员时,在你的例子中,它会尝试解析'FirstName','LastName‘等。有了'MyFriends',它将尝试用对象的视图来解决这个问题。如果仍然失败,它将尝试使用视图的CurrentItem来解决它,这就是魔术发生的地方。您可以在PropertyPathWorker.UpdateSourceValueState(int k, ICollectionView collectionView, object newValue, bool isASubPropertyChange)PropertyPathWorker.ReplaceItem(int k, object newO, object parent)中找到这些代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54733961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档