2010-06-10 96 views
6

这个例子是一个有点人为的做法,但我正在做类似的事情。比方说,我有以下简单的类:有没有一种简单的方法来指定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,我想访问的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数据上下文。如果你不得不,最有效的方法是什么?

+0

为什么不能正常工作? 'Binding =“{Binding Name,Mode = TwoWay}”' – Amsakanna 2010-06-10 09:10:20

+0

@Veer,因为类Alias中没有Name属性... – Anvaka 2010-06-10 14:25:40

+0

@Anvaka:但datacontext设置了person类的实例。它应该知道Name属性。 – Amsakanna 2010-06-10 14:51:46

回答

10

这应该为你工作:

<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}} 
+1

这是非常冗长的。你的第一个例子应该写成'{Binding RelativeSource = {RelativeSource FindAncestor,Grid,3}}'。其他人也应该简化。任何了解FindAncestor函数的人都会像你的四行代码一样容易理解'FindAncestor,Grid,3',并且思路较少。 – 2010-06-17 06:29:52

0

我觉得有没有更好的办法来做到这一点比使用相对源了树。您可以重写您的模型(例如,从Alias添加对父Person的引用),但那不是更好的方法。

从性能的角度来看,我从来没有发现相对源绑定的瓶颈。总有些东西可以让你的应用远离火箭的速度。

相关问题