如何在嵌套在HierarchicalDataTemplate中的DataTemplate中设置RelativeSource?

Dab*_*rnl 5 .net data-binding wpf

我有以下XAML,它可以完成所有应做的事情,除了FontSize上的MultiBinding在检索用户时失败(我在转换器中设置断点时看到DependencyProperty.UnsetData)。如您所见,Users是IEnumerable<UserData>HierarchicalDataTemplate的DataContext的一部分。

我该如何引用?

<TreeView Name="AllGroups" ItemsSource="{Binding}" >
      <TreeView.Resources>
           <HierarchicalDataTemplate DataType="{x:Type PrivateMessengerUI:GroupContainer}"
                                     ItemsSource="{Binding Users}"
                                                  >
                  <Label Content="{Binding GroupName}"/>
            </HierarchicalDataTemplate>
            <DataTemplate DataType="{x:Type PrivateMessenger:UserData}">
               <TextBlock Text="{Binding Username}"
                          ToolTip="{StaticResource UserDataGroupBox}"
                          Name="GroupedUser"
                          MouseDown="GroupedUser_MouseDown">
                    <TextBlock.FontSize>
                         <MultiBinding Converter="{StaticResource LargeWhenIAmSelected}">
                               <Binding ElementName="Root" Path="SelectedUser"/>
                               <Binding RelativeSource="???"
                                        Path="DataContext.Users"/>
                         </MultiBinding>
                     </TextBlock.FontSize>
               </TextBlock>
           </DataTemplate>
         </TreeView.Resources>
      </TreeView>
Run Code Online (Sandbox Code Playgroud)

Dab*_*rnl 5

正确答案是:

<Binding RelativeSource="{RelativeSource FindAncestor,
                                         AncestorType={x:Type TreeViewItem},
                                         AncestorLevel=2}"
                           Path="DataContext.Users"/>
Run Code Online (Sandbox Code Playgroud)

祖先级别至关重要且具有欺骗性:如果忽略该级别,则假定级别为1,并且实际上指向DataTemplate的容器(也是无子级TreeViewItem!),而不是 HierarchicalDataTemplate的容器。