说我在Grid
里面有一个Line
和一个Grid
。我希望Line
的宽度始终与Grid
的宽度相同。所以,我绑定他们
<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>
该线最初采用网格的宽度,但更改网格的大小不会更改线的宽度。如何正确绑定这些属性?
可能不是您正在寻找的实现,但如果您真的想要这种行为,您可以始终定义一个事件处理程序来响应您的Grid SizeChanged
事件,并在代码隐藏中更新Line X2
属性:
<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>
在EventHandler中更新你的Line
,
private void grid_SizeChanged(object sender, SizeChangedEventArgs e)
{
myline.X2 = grid.ActualWidth;
}
我不仅没有获得任何类型的绑定错误表达式,而且绑定到ActualWidth
依赖属性也不适用于其他控件,例如TextBox
。
更明显的是,原因是指向ActualWidth依赖属性的特定行为,而不是其他任何东西。在FrameworkElement类上查看ActualWidth
文档(ActualWidth)时,找到了支持此方法的证据。
虽然它具有ActualWidthProperty支持字段,但ActualWidth不会引发属性更改通知,它应该被视为常规CLR属性而不是依赖项属性。
...
出于ElementName绑定的目的,ActualWidth在更改时不会发布更新(由于其异步和运行时计算的性质)。不要尝试使用ActualWidth作为ElementName绑定的绑定源。如果您的方案需要基于ActualWidth进行更新,请使用SizeChanged处理程序。
回顾上面的Binding
定义,我将绑定模式从默认OneWay
更改为OneTime
,仅在首次显示UI时计算X2
属性的初始维度,因为没有理由“浪费”资源试图“观察“在源头我们永远不会发出任何修改信号的ActualWidth
值修改。或者你可以随时在code-behind
中设置初始值。