Есть ли простой способ указать привязку данных WPF, где путь на один уровень выше? - PullRequest
8 голосов
/ 10 июня 2010

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

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 вместо свойств псевдонимов, как во втором столбце здесь:

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

Ответы [ 2 ]

13 голосов
/ 10 июня 2010

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

<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}}
0 голосов
/ 10 июня 2010

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

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

...