У меня есть следующий XAML, который делает все, что он, как предполагается, за исключением того, что MultiBinding на FontSize перестал работать при получении Пользователей (я вижу DependencyProperty. UnsetData, когда я установил точку останова в преобразователе). Поскольку Вы видите, что Пользователи 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>
Правильный ответ:
<Binding RelativeSource="{RelativeSource FindAncestor,
AncestorType={x:Type TreeViewItem},
AncestorLevel=2}"
Path="DataContext.Users"/>
Уровень предков имеет решающее значение и вводит в заблуждение: когда вы его опускаете, предполагается уровень 1, который фактически указывает на контейнер DataTemplate (который тоже является бездетным TreeViewItem!), не контейнер HierarchicalDataTemplate.
Í нет доступа к среде IDE, чтобы опробовать ее (задержка ...), но я бы попробовал использовать режим FindAncestor, например:
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type PrivateMessengerUI:GroupContainer}}
Это должно подняться по логическому дереву, чтобы найти группу контейнер.