幅が「1 *」のグリッドがあります。したがって、実際の幅は実行時に決定されます。そのグリッド内に、親グリッドのランタイム幅に設定したい幅を持つ別のグリッドがあります。バインディングによってxamlでそれを行うにはどうすればよいですか。
これは実際にあなたを助けるでしょう
Width="{Binding ActualWidth, ElementName=parentElementName}"
これにより、幅が親要素または指定された要素名にバインドされます
これはどこでも機能する一般的なソリューションです。親要素名を記述する必要はありません。これは親を識別し、親の幅を取ります。
Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ActualWidth}"
同じことをする最も簡単な方法は次のとおりです:
HorizontalAlignment="Stretch"
それはあなたが尋ねられたようにバインディングを使用していませんが、それは簡単です。
あなたがCodeBehindでそれをしているなら、これは私のために機能します。 bindMeが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);
}
使用法:
child.BindWidth(parent);
Width="{Binding Width, RelativeSource={RelativeSource AncestorType={x:Type Parent}, Mode=FindAncestor}}"
両方のコントロールDataContextが異なる場合。
テンプレート内にある場合、これを使用します。
<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>