2010-06-10 18 views
6

Ví dụ này là một thừa nhận một chút contrived nhưng tôi đang làm một cái gì đó tương tự. Hãy nói rằng tôi có các lớp học đơn giản sau đây:Có cách nào đơn giản để chỉ định một dữ liệu WPF nơi đường dẫn là một "cấp" lên không?

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

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

Và chúng ta hãy nói rằng tôi có XAML với một mạng lưới LayoutRoot, và một DataGrid nơi tôi muốn truy cập thuộc tính Name trong DataGrid thay các thuộc tính biệt hiệu như trong cột thứ hai ở đây:

<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> 

Đó là cách trực quan cách tôi cố gắng ràng buộc tên, nhưng không cần phải nói rằng có vẻ ngu ngốc. Có một cái gì đó như thế khi xác định một con đường, hoặc là bạn buộc phải có được một nguồn tương đối lên đến bối cảnh dữ liệu LayoutRoot. Nếu bạn phải, cách hiệu quả nhất là gì?

+0

Tại sao tính năng này không hoạt động? 'Binding =" {Binding Name, Mode = TwoWay} "' – Amsakanna

+0

@Veer, bởi vì không có thuộc tính Tên trong lớp Bí danh ... – Anvaka

+0

@Anvaka: Nhưng datacontext được đặt thể hiện của lớp người. Nó sẽ biết thuộc tính Name. – Amsakanna

Trả lời

10

này nên làm việc cho bạn:

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

Bạn có thể sử dụng bất kỳ những điều sau đây:

Để thực hiện các yếu tố nguồn bằng với cha mẹ gần gũi nhất của một loại nhất định:

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

Để làm cho phần tử nguồn bằng cha mẹ gần nhất thứ n của một loại đã cho:

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

Để thực hiện các yếu tố nguồn bằng các mục dữ liệu trước đó trong một bộ sưu tập dữ liệu-bound:

{Binding RelativeSource={RelativeSource PreviousData}} 
+1

Đây là điều hết sức kỳ quặc. Ví dụ đầu tiên của bạn phải được viết '{Binding RelativeSource = {RelativeSource FindAncestor, Grid, 3}}'. Những người khác cũng nên được đơn giản hóa. Bất cứ ai hiểu chức năng của FindAncestor sẽ hiểu 'FindAncestor, Grid, 3' dễ dàng như bốn dòng mã của bạn, và với ít suy nghĩ hơn. –

0

Tôi nghĩ rằng không có cách nào tốt hơn để làm điều này vì sử dụng nguồn tương đối lên cây. Bạn có thể viết lại mô hình của bạn (ví dụ, thêm một tham chiếu đến phụ huynh Person từ Alias) nhưng đó là cách tiếp cận hầu như không tốt hơn.

Từ triển vọng hiệu suất, tôi không bao giờ tìm thấy nút cổ chai trong các liên kết nguồn tương đối. Luôn có điều gì đó khác giúp ứng dụng của bạn tránh xa tốc độ tên lửa.

Các vấn đề liên quan