Как установить RelativeSource в DataTemplate, который вложен в HierarchicalDataTemplate? - PullRequest
5 голосов
/ 04 апреля 2010

У меня есть следующий XAML, который делает все, что должен, за исключением того, что MultiBinding на FontSize не может получить пользователей (я вижу DependencyProperty.UnsetData, когда я устанавливаю точку останова в конвертере).Как вы можете видеть, Users - это IEnumerable<UserData>, который является частью DataContext HierarchicalDataTemplate.

Как мне ссылаться на него ??

<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>

Ответы [ 2 ]

5 голосов
/ 04 апреля 2010

Правильный ответ:

<Binding RelativeSource="{RelativeSource FindAncestor,
                                         AncestorType={x:Type TreeViewItem},
                                         AncestorLevel=2}"
                           Path="DataContext.Users"/>

Уровень предков является критическим и вводящим в заблуждение: когда вы его опускаете, принимается уровень 1, который фактически указывает на контейнер DataTemplate (который является бездетным)TreeViewItem тоже!), не контейнер HierarchicalDataTemplate.

0 голосов
/ 04 апреля 2010

Í у меня нет доступа к IDE, чтобы попробовать его (в выходные ...), но я бы попробовал использовать режим FindAncestor, например:

RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type PrivateMessengerUI:GroupContainer}}

Это должно пойти вверх по логическому дереву, чтобы найти контейнер группы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...