Reputation: 2748
I have a grid whose width is "1*". So the actual width decided at runtime I think. Within that grid I have another grid whose width I want to set to the runtime width of parent grid. How Can I do that in xaml through binding.
Upvotes: 63
Views: 127355
Reputation: 141
HorizontalAlignment doesn't work for buttons in Xamarin, you can use HorizontalOptions instead
HorizontalOptions="Fill"
Upvotes: 0
Reputation: 69
Use HorizontalContentAlignment="Stretch" on ListBox:
<ListBox HorizontalContentAlignment="Stretch">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<Image HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Source="TestImage.png"/>
<TextBlock HorizontalAlignment="Center" Text="Test Text"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
or if it is inside a Template use this:
<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>
Upvotes: -1
Reputation: 1118
Width="{Binding Width, RelativeSource={RelativeSource AncestorType={x:Type Parent}, Mode=FindAncestor}}"
if both controls DataContext is different.
Upvotes: 7
Reputation: 2025
This is generic solution which may work everywhere. You wouldn't need to write parent element name. This will identify its parent and will take parent's width.
Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ActualWidth}"
Upvotes: 58
Reputation: 27285
If you are doing it in CodeBehind, this works for me. It has the added advantage that bindMe does not have to be a child of 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);
Upvotes: 4
Reputation: 507
I think that easiest way to do same thing is:
HorizontalAlignment="Stretch"
That is not using binding as you have been asked, but it is easier.
Upvotes: 28
Reputation: 4899
This will actually help you I guess
Width="{Binding ActualWidth, ElementName=parentElementName}"
This binds the width to the parent element or the element name provided
Upvotes: 137