2010-06-10 8 views
6

Bu örnek bir itiraftan ibarettir ama benzer bir şey yapıyorum. ı Aşağıdaki basit sınıfları var diyelim:Yolun bir "seviye" yukarı olduğu bir WPF veritabanını belirtmenin basit bir yolu var mı?

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

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

Ve ı bir LayoutRoot ızgara ile Xaml olduğunu varsayalım, ben adlar özelliklerinin yerine gibi DataGrid içinde Name özelliği erişmek istediğiniz bir DataGrid burada ikinci sütuna:

adını bağlamak girişiminde, ama gereksiz o aptal görünüyor söylemek nasıl sezgisel olduğunu
<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> 

. Bir yol belirlerken böyle bir şey var mı, yoksa LayoutRoot veri içeriğine kadar göreli bir kaynak elde etmeye zorlanıyorsunuz. Eğer gerekiyorsa, en verimli yol nedir?

+0

Neden bu çalışmıyor? 'Binding =" {Binding Name, Mode = TwoWay} "' – Amsakanna

+0

@Veer, çünkü Alias ​​sınıfında Name özelliği bulunmuyor ... – Anvaka

+0

@Anvaka: Ancak, datacontext kişi sınıfı örneğini ayarlıyor. İsim özelliğini bilmeli. – Amsakanna

cevap

10

Bu sizin için çalışması gerekir:

<DataGridTextColumn Header="Name" 
        Binding="{Binding RelativeSource={RelativeSource 
                 FindAncestor, 
                 AncestorLevel=3, 
                 AncestorType={x:Type Grid}, 
                 Mode=FindAncestor}, 
                Path=DataContext.Name}"/> 

Sen herhangi birini kullanabilirsiniz şunlardır:

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type 
desiredType}}} 

:

kaynak elemanı belirli bir türden en yakın üst eşit hale getirmek için Kaynak elemanın belirli bir türdeki en yakın ebeveyne eşit olmasını sağlamak için:

{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorLevel=n, AncestorType={x:Type desiredType}}} 

kaynak elemanı bir veriye bağlı koleksiyonunda önceki veri öğesini eşit hale getirmek için:

{Binding RelativeSource={RelativeSource PreviousData}} 
+1

Bu çok çirkin bir sonuçtur. İlk örneğiniz yazılmalıdır: {Binding RelativeSource = {RelativeSource FindAncestor, Grid, 3}}. Diğerleri de basitleştirilmelidir. FindAncestor'ın işlevini anlayan herkes, FindAncestor, Grid, 3'ü dört kod satırı kadar kolay ve daha az düşünerek anlayacaktır. –

0

Ben ağacın yukarı göreceli kaynağı kullanılarak daha bunu yapmak için iyi bir yol olduğunu düşünüyorum. Modelinizi yeniden yazabilirsiniz (örneğin Person numaralı bağlantıya Alias'dan bir başvuru ekleyin) ancak bu daha iyi bir yaklaşım değildir.

Performanstan gelecekteki olası bağıl bağlarda tıkanıklık bulamadım. Uygulamanızı roket hızından uzak tutan her zaman başka bir şey var.