2017-12-29 59 views
0

Sagen Sie, ich habe eine Grid und eine Line innerhalb dieser Grid. Ich möchte die Line 's Breite die gleiche wie die Grid' s Breite die ganze Zeit. Also, gebunden ich sieuwp Datenbindung: Wie man eine Änderung von Grid.WidthProperty zu hören

<Page 
    x:Class="GeoDraw.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:GeoDraw" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:x1="using:System" 
    mc:Ignorable="d" Background="#FF262626" RequestedTheme="Dark" Loaded="Page_Loaded"> 

    <Grid x:Name="grid" BorderBrush="#FFE02121" Margin="20" Background="#FFD69696"> 
     <Line Stroke="White" Y1="20" Y2="20" X1="0" X2="{Binding ElementName=grid, Path=ActualWidth}" /> 
    </Grid> 
</Page> 

die Leitung nimmt zunächst die Breite des Gitters, aber das Netz der Größe ändert nicht die Breite der Linie ändern. Wie kann ich diese Eigenschaften korrekt binden?

Antwort

1

Wahrscheinlich nicht die Implementierung, die Sie suchen, aber wenn Sie wirklich, dass das Verhalten wollen könnte man immer einen Event-Handler definieren, um Ihre Grid SizeChanged Ereignis, und aktualisieren Sie die Linie X2 Eigenschaft in Code-behind zu reagieren:

<Grid x:Name="grid" BorderBrush="#FFE02121" Margin="20" Background="#FFD69696" SizeChanged="grid_SizeChanged"> 
    <Line x:Name="myline" Stroke="White" Y1="20" Y2="20" X1="0" X2="{Binding ActualWidth, ElementName=grid, Mode=OneTime}" /> 
</Grid> 

aktualisieren Sie Ihre Line im Eventhandler,

private void grid_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    myline.X2 = grid.ActualWidth; 
} 

nicht nur war ich nicht jede Art von Bindung Fehler Ausdruck zu erhalten, sondern auf die ActualWidth depe Bindung Die Nendeneigenschaft funktionierte nicht für andere Steuerelemente, z. B. TextBox.

Es wurde deutlicher, dass der Grund eher auf ein bestimmtes Verhalten der ActualWidth-Abhängigkeitseigenschaft als auf irgendetwas anderes hinwies. Beim Auschecken der Dokumentation ActualWidth (ActualWidth) für die FrameworkElement-Klasse wurden Hinweise gefunden, die diesen Ansatz unterstützen.

Obwohl es ein ActualWidthProperty Trägerfeld hat, Actual hat nicht Eigentum Änderungsbenachrichtigungen erhöhen und es sollte als Eigenschaft eine reguläre CLR gedacht werden und nicht eine Abhängigkeitseigenschaft.

...

Zum Zweck des Elements Bindung Actual Updates posten nicht , wenn es (aufgrund seines asynchronen und Laufzeit Natur berechnet) ändert. Versuchen Sie nicht, ActualWidth als Bindungsquelle für eine ElementName-Bindung zu verwenden. Verwenden Sie einen SizeChanged-Handler, wenn Sie ein Szenario haben, das Updates benötigt, die auf ActualWidth basieren.

oben zurück auf die Binding Definition Sehen, änderte ich den Bindungsmodus von seinem Standard OneWay zu OneTime, um nur die erste Dimension für die X2 Eigenschaft zu berechnen, wenn das UI zuerst gezeigt wird, da gibt es keinen Grund Ressourcen zu "vergeuden", die versuchen, eine ActualWidth Wertänderung zu "beobachten", wenn an der Quelle niemals Änderungen gemeldet werden. Oder Sie könnten immer den Anfangswert in code-behind auch setzen.

+1

genau !! Ich habe mich auch über die TextBox gewundert. Jetzt verstehe ich. Vielen Dank Andre :) –

Verwandte Themen