2010-09-06 2 views
6

Meine Frage ist über das Binden der Eigenschaft eines Elements an ein anderes.Binding Rasterhöhe mit FindAncestor und AhnenLevel zu einem anderen Raster

Hier wird die Struktur meiner Code ist:

  1. Datenvorlage enthält ein Raster (lassen Sie uns das Gitter GridA genannt) und im Netz, ich eine Instanz einer Kontrolle angeben, genannt ControlA.

  2. ControlA ist eine UserControl, die eine Grid enthält. Es gibt eine benutzerdefinierte Logik in ControlA (Code-Behind), die den Inhalt dynamisch erstellt - aber in Kürze verwendet es eine andere Datenvorlage. Die Datenvorlage für ControlA besteht aus einer weiteren Grid. Ich möchte die Height -Eigenschaft für dieses Raster in dieser Datenvorlage an die Height -Eigenschaft der Grid in der Datenvorlage binden, die in meinem ersten Aufzählungspunkt oben verwiesen wird (das Raster GridA genannt).

Hier ist die XAML, die ich für die Bindung verwendet haben, aber im Wesentlichen wissen, es ist nicht funktioniert, wie es ist nicht das Grid zu finden:

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

Ich verstehe, dass AncestorLevel=2 durch die Angabe, dass es verwendet das zweite "gefundene" Vorkommen des Typs, den Sie suchen, in diesem Fall lautet der Typ Grid. Also in meiner Meinung, wird es zuerst die Grid in ControlA finden, dann wird es weiterhin auf den Baum gehen und finden Sie die Grid in der ersten Datenvorlage, die die Grid mit dem Namen GridA ist. Dies sollte das zweite Vorkommen sein, richtig?

Antwort

6

Da Sie Ihre Suche aus dem zweiten Raster starten, möchten Sie eigentlich Vorfahrebene = 1 (das ist die Standardeinstellung). Beobachten:

BTW, klingt Ihr Design wie es WPF-Layout-System bekämpft, anstatt es zu umarmen. Als solches verursachen Sie wahrscheinlich eine Menge unnötiger Schmerzen für sich selbst.

+0

Danke für die Rückmeldung. Ich stimme Ihnen mit Kommentaren bezüglich des Designs zu - das war nicht meine Entscheidung und wurde vor meiner Hinzufügung zu diesem Projekt gemacht. In Bezug auf Ihren Vorschlag ist es das dritte Raster, das an das erste Raster binden muss. Also, Ihr Beispiel für das dritte Gitter spezifiziert AncestorLevel = 2, was ich in meinem Beispiel angegeben habe. Also, ich bin verwirrt. Wenn wir beide AncestorLevel = 2 angeben, was mache ich dann falsch? – Chris

+0

Ich habe drei Gitter, während Sie angeben, dass Sie zwei haben. Aber vielleicht habe ich deine Frage missverstanden. Funktioniert es, wenn Sie die Stufe Ihres Vorfahren auf 1 ändern? –

0

Fehle ich etwas oder könnten Sie einfach die SharedSizeGroup Eigenschaft der RowDefinitions verwenden und Grid.IsSharedSizeGroup="True" auf das äußerste Steuerelement setzen?

+0

Ja, bitte lesen Sie diesen Artikel hier, um die Einschränkungen von SharedSizeGroup zu verstehen: http://blogs.interknowlogy.com/2007/08/27/grid-size-sharing-in-wpf – Marc

Verwandte Themen