有没有一种简单的方式来指定WPF数据绑定,其中路径向上“一级”?

9

这个例子有点牵强,但我正在做类似的事情。假设我有以下简单的类:

public class Person
{
    public string Name { get; set; }
    public List<Alias> Aliases { get; set; }
}

public class Alias
{
    public string AliasName { get; set; }
}

假设我有一个包含LayoutRoot网格和DataGrid的XAML,我想要访问DataGrid中的Name属性,而不是像这里第二列中的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数据上下文的相对源?如果必须这样做,最有效的方式是什么?


为什么这个不起作用?Binding="{Binding Name, Mode=TwoWay}" - Amsakanna
@Veer,因为类别名中没有 Name 属性... - Anvaka
@Anvaka:但是数据上下文设置为Person类的实例。它应该知道Name属性。 - Amsakanna
@Veer:哦,你说得对!我错过了。但是我们正在使用别名作为ItemsSource,这是否意味着在行的DataContext中会有Alias?即使不是这样,那么AliasName也不起作用... - Anvaka
2个回答

16

这应该适用于你的情况:

<DataGridTextColumn Header="Name" 
                    Binding="{Binding RelativeSource={RelativeSource 
                                                      FindAncestor,
                                                      AncestorLevel=3, 
                                                      AncestorType={x:Type Grid},
                                                    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}}

3
这太啰嗦了。你的第一个例子应该写成{Binding RelativeSource={RelativeSource FindAncestor,Grid,3}}。其他的也应该简化。任何理解FindAncestor功能的人都会像你的四行代码一样轻松地理解FindAncestor,Grid,3,而且思考量更少。 - Ray Burns

0

我认为没有比使用相对源更好的方法了。你可以重写你的模型(例如,从Alias中添加一个对父级Person的引用),但这几乎不是更好的方法。

从性能的角度来看,我从来没有发现相对源绑定存在瓶颈。总有其他因素会影响你的应用程序速度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接