2010-06-10 44 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的引用),但那不是更好的方法。

從性能的角度來看,我從來沒有發現相對源綁定的瓶頸。總有些東西可以讓你的應用遠離火箭的速度。

相關問題