J'ai une grille dont la largeur est "1 *". Donc, la largeur réelle décidée au moment de l'exécution, je pense que… .. Dans cette grille, j'ai une autre grille dont je veux définir la largeur comme largeur d'exécution de la grille parente. Comment puis-je faire cela dans xaml en liant.
Cela vous aidera vraiment je suppose
Width="{Binding ActualWidth, ElementName=parentElementName}"
Cela lie la largeur à l’élément parent ou au nom de l’élément fourni
C'est une solution générique qui peut fonctionner partout. Vous n'avez pas besoin d'écrire le nom de l'élément parent. Cela identifiera son parent et prendra la largeur du parent.
Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ActualWidth}"
Je pense que la meilleure façon de faire la même chose est de:
HorizontalAlignment="Stretch"
Ce n'est pas en utilisant la liaison comme on vous l'a demandé, mais c'est plus facile.
Si vous le faites dans CodeBehind, cela fonctionne pour moi. Cela présente l'avantage supplémentaire que bindMe ne doit pas nécessairement être un enfant de toMe:
public static void BindWidth(this FrameworkElement bindMe, FrameworkElement toMe)
{
Binding b = new Binding();
b.Mode = BindingMode.OneWay;
b.Source = toMe.ActualWidth;
bindMe.SetBinding(FrameworkElement.WidthProperty, b);
}
usage:
child.BindWidth(parent);
Width="{Binding Width, RelativeSource={RelativeSource AncestorType={x:Type Parent}, Mode=FindAncestor}}"
si les deux contrôles DataContext est différent.
Si c'est dans un modèle, utilisez ceci:
<ListBox>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<Image Width="{TemplateBinding Width}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Source="TestImage.png"/>
<TextBlock HorizontalAlignment="Center" Text="Test Text"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>