如何绑定到Popup ActualHeight

时间:2014-01-22 09:49:12

标签: c# wpf xaml mvvm

我有一个网格,我希望弹出窗口与它保持恒定关系,无论弹出窗口和网格的大小如何。我在这里使用转换器是代码

 < Grid Name=YParamTextBlock>
       <TextBlock HorizontalAlignment="Center"/>
       <Popup PlacementTarget="{Binding ElementName=YParamTextBlock}} Placement="Center">
             <Popup.VerticalOffSet>
                  <MultiBinding Mode="OneWay" Converter="{StaticResource OffsetConverter} NotifyOnTargetChanged="True">
                         <Binding Mode="OneWay" ElementName="YParamTextBlock" Path="ActualHeight" NotifyOnTargetUpdated="True"/>
                         <Binding Mode="OneWay" RelativeSource={RelativeSource Self} Path="ActualHeight" NotifyOnTargetChanged="True"/>
                    </MultiBinding>
               </Popup.VerticalOffset>
        </Popup>
  <Grid>

问题是两个控件首次创建时的实际高度为0.0,所以我添加了NotifyOnTargetChanged以便修复它。 现在,由于某种原因,NotifyOnTargetChanged修复了Grid的ActualHeight的重新绑定,但Popup仍为0.0。反正有没有通知弹出窗口实际高度有变化?或者针对这个问题的任何其他解决方案?

2 个答案:

答案 0 :(得分:0)

实际高度和宽度是read-only您无法直接绑定,您可以使用Kent Boogaart在此Answer

中解释的解决方案

答案 1 :(得分:0)

为什么多重绑定? VerticalOffset是双倍的,因此您只需要一个绑定值。

我不知道你的转换器做了什么,但是假设你希望它获取你的YParamTextBlock网格的ActualHeight属性然后返回一个对应你想要给你的弹出窗口的VerticalOffset的双,那么下面的内容可能更容易遵循:

<Grid x:Name="YParamTextBlock">
       <TextBlock HorizontalAlignment="Center"/>
       <Popup PlacementTarget="{Binding ElementName=YParamTextBlock}} 
              Placement="Center"
              VerticalOffset="{Binding ActualHeight, ElementName=YParamTextBlock, 
                               Converter={StaticResource OffsetConverter}}"/>

<Grid>