uwp数据绑定:如何监听Grid.WidthProperty的任何更改

问题描述 投票:0回答:1

说我在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>

该线最初采用网格的宽度,但更改网格的大小不会更改线的宽度。如何正确绑定这些属性?

xaml data-binding uwp windows-10-universal
1个回答
1
投票

可能不是您正在寻找的实现,但如果您真的想要这种行为,您可以始终定义一个事件处理程序来响应您的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中设置初始值。

© www.soinside.com 2019 - 2024. All rights reserved.