Существует ли простой способ указать привязку данных WPF, где путь находится на одном уровне тот?

Этот пример немного изобретен, но я делаю что-то подобное. Скажем, у меня есть следующие простые классы:

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. Если Вы имеете к, каков самый эффективный путь?

8
задан Ben McIntosh 10 June 2010 в 07:53
поделиться

2 ответа

Это должно сработать для вас:

<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}}
13
ответ дан 5 December 2019 в 12:56
поделиться

Я думаю, что нет лучшего способа сделать это, чем использовать относительный источник вверху дерева. Вы можете переписать свою модель (например, добавить ссылку на родительский Person из Alias ​​), но это вряд ли лучший подход.

С точки зрения производительности я никогда не обнаруживал узких мест в относительных привязках источников. Всегда есть что-то еще, что удерживает ваше приложение от ракетной скорости.

0
ответ дан 5 December 2019 в 12:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: