2010-09-06 32 views
6

Câu hỏi của tôi là về việc ràng buộc đúng thuộc tính của một phần tử với phần tử khác.Chiều cao lưới liên kết bằng cách sử dụng FindAncestor và AncestorLevel Để một lưới khác

Dưới đây là cấu trúc của mã của tôi:

  1. Mẫu dữ liệu chứa một mạng lưới (chúng ta hãy gọi là lưới GridA), và trong lưới, tôi chỉ định một thể hiện của một điều khiển, được gọi là ControlA.

  2. ControlAUserControl có chứa Grid. Có logic tùy chỉnh trong ControlA (mã-đằng sau) tự động tạo nội dung - nhưng tóm lại, nó sử dụng một mẫu dữ liệu khác.

  3. Mẫu dữ liệu cho ControlA bao gồm một mẫu khác Grid. Tôi muốn liên kết thuộc tính Height cho lưới này trong mẫu dữ liệu này với thuộc tính Height của Grid trong mẫu dữ liệu được tham chiếu trong dấu đầu dòng đầu tiên của tôi ở trên (lưới được gọi là GridA).

Đây là XAML mà tôi đã sử dụng để ràng buộc, nhưng, về cơ bản, nó isnt làm việc, vì nó không tìm Lưới:

<Grid Height="{Binding Path=ActualHeight, 
         RelativeSource={RelativeSource FindAncestor, 
             AncestorType=Grid, 
             AncestorLevel=2}, 
         UpdateSourceTrigger=PropertyChanged}"> 
</Grid> 

Tôi hiểu rằng bằng cách xác định AncestorLevel=2, rằng nó sẽ sử dụng lần xuất hiện "tìm thấy" thứ hai của loại mà bạn đang tìm kiếm, trong trường hợp này, loại là Grid. Vì vậy, trong tâm trí của tôi, đầu tiên nó sẽ tìm thấy Grid trong ControlA, sau đó nó sẽ tiếp tục đi bộ lên cây và tìm Grid trong mẫu dữ liệu đầu tiên, là Grid có tên GridA. Đây sẽ là lần xuất hiện thứ hai, đúng không?

Trả lời

6

Vì bạn đang bắt đầu tìm kiếm từ lưới thứ hai, bạn thực sự muốn cấp độ tổ tiên = 1 (là mặc định). Quan sát:

<Grid x:Name="first"> 
    <Grid x:Name="second"> 
     <Grid x:Name="third" Tag="{Binding Name, RelativeSource={RelativeSource FindAncestor, AncestorType=Grid, AncestorLevel=2}}"> 
      <!-- displays "first", not "second" --> 
      <TextBlock Text="{Binding Tag, ElementName=third}"/> 
     </Grid> 
    </Grid> 
</Grid> 

BTW, thiết kế của bạn giống như âm thanh chiến đấu với hệ thống bố cục của WPF thay vì chấp nhận nó. Như vậy, có lẽ bạn đang tạo ra rất nhiều đau đớn không cần thiết cho chính mình.

+0

Cảm ơn phản hồi. Tôi đồng ý với bạn về các nhận xét liên quan đến thiết kế - đó không phải là lựa chọn của tôi và đã được thực hiện trước khi tôi thêm vào dự án này. Về đề xuất của bạn, đó là lưới thứ ba phải liên kết với lưới đầu tiên. Vì vậy, ví dụ của bạn cho lưới thứ ba quy định AncestorLevel = 2, đó là những gì tôi đã nêu trong ví dụ của tôi. Vì vậy, tôi bối rối. Nếu chúng ta đều chỉ định AncestorLevel = 2, tôi đang làm gì sai? – Chris

+0

Tôi có ba lưới, trong khi bạn nói bạn có hai. Nhưng có lẽ tôi đã hiểu lầm câu hỏi của bạn. Nó có hoạt động nếu bạn thay đổi cấp độ tổ tiên của bạn thành 1? –

0

Tôi có thiếu thứ gì đó không hoặc bạn có thể sử dụng thuộc tính SharedSizeGroup của RowDefinitions và đặt Grid.IsSharedSizeGroup="True" trên điều khiển ngoài cùng không?

+0

Có, xin vui lòng đọc bài viết này ở đây để hiểu những hạn chế của SharedSizeGroup: http://blogs.interknowlogy.com/2007/08/27/grid-size-sharing-in-wpf – Marc

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