Этот пример немного изобретен, но я делаю что-то подобное. Скажем, у меня есть следующие простые классы:
public class Person
{
public string Name { get; set; }
public List<Alias> Aliases { get; set; }
}
public class Alias
{
public string AliasName { get; set; }
}
И скажем, что у меня есть Xaml с сеткой LayoutRoot и DataGrid, где я хочу получить доступ к свойству Name в DataGrid вместо свойств Aliases как во втором столбце здесь:
<Grid x:Name="LayoutRoot" DataContext="PersonInstance">
<DataGrid ItemsSource="{Binding Aliases}">
<DataGrid.Columns>
<data:DataGridTextColumn Header="AliasName" Binding="{Binding AliasName, Mode=TwoWay}"/>
<data:DataGridTextColumn Header="Name" Binding="{Binding ../Name, Mode=TwoWay}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
Это интуитивно, как я попытался бы связать имя, но само собой разумеется который выглядит глупым. Есть ли что-то как этот при определении пути или Вы вынужденный получить относительный источник до контекста данных LayoutRoot. Если Вы имеете к, каков самый эффективный путь?
Это должно сработать для вас:
<DataGridTextColumn Header="Name"
Binding="{Binding RelativeSource={RelativeSource
FindAncestor,
AncestorLevel=3,
AncestorType={x:Type Grid},
Mode=FindAncestor},
Path=DataContext.Name}"/>
Вы можете использовать любой из следующих вариантов:
Чтобы сделать исходный элемент равным ближайшему родителю данного типа:
{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type
desiredType}}}
Чтобы сделать исходный элемент равным n-му ближайшему родителю данного типа:
{Binding RelativeSource={RelativeSource FindAncestor,
AncestorLevel=n, AncestorType={x:Type desiredType}}}
Чтобы сделать исходный элемент равным предыдущему элементу данных в коллекции, связанной с данными:
{Binding RelativeSource={RelativeSource PreviousData}}
Я думаю, что нет лучшего способа сделать это, чем использовать относительный источник вверху дерева. Вы можете переписать свою модель (например, добавить ссылку на родительский Person
из Alias
), но это вряд ли лучший подход.
С точки зрения производительности я никогда не обнаруживал узких мест в относительных привязках источников. Всегда есть что-то еще, что удерживает ваше приложение от ракетной скорости.