Silverlight中DataTemplate中的TemplatedParent绑定使用相对源RelativeSource是否可行?

4
我正在尝试制作一个条形图用户控件,我使用DataTemplate创建每个条形。问题在于,为了计算每个条形的高度,我需要先知道其容器(TemplatedParent)的高度。不幸的是,我现在只有:
Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Height,  Converter={StaticResource HeightConverter}, Mode=OneWay}" 

不起作用。每次我的转换器返回NaN的值时,RelativeSource={RelativeSource TemplatedParent}在这种情况下不起作用吗?我还能做什么来允许我的DataTemplate与应用它的元素“交流”?

如果有帮助的话,这是裸骨DataTemplate:

<DataTemplate x:Key="BarGraphTemplate">
    <Grid Width="30">
        <Rectangle HorizontalAlignment="Center" Stroke="Black" Width="20" Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Height,  Converter={StaticResource HeightConverter}, Mode=OneWay}" VerticalAlignment="Bottom" />
    </Grid>
</DataTemplate>
2个回答

5
回答你的问题,RelativeSource 只在 ControlTemplate 中起作用,而不在 DataTemplate 中起作用。
您为什么不使用 Silverlight Toolkit Chart 控件来创建条形图(或者工具包称之为垂直柱状图)呢?请参考Silverlight Toolkit概述第2部分

直到现在我从未听说过Silverlight Toolkit Chart控件。看起来很有趣,但是使用用户控件应该足够简单来创建一个BarChart。我只希望有更好的方法让DataTemplate引用应用程序中的其他对象。DataTemplate似乎非常孤立,这使得创建真正动态的内容变得困难。 - Matt.M

0
你尝试过使用 ActualHeight 属性吗?它应该会返回一个值。在数据模板中,使用 TemplatedParent 模式的 RelativeSource 虽然可行,但它会返回模板化控件/项的内容呈现器,而不是控件/项本身(当在控件模板中使用时会返回控件/项本身)。为了实验,可以在数据模板中放置一个按钮,并将该绑定表达式(不含路径)分配给其 Tag 属性。处理其 Click 事件,并在事件处理程序中设置断点。现在当运行项目并单击按钮时,断点将命中您的代码,并且您可以从按钮的 Tag 属性(可以从 sender 参数中看到)中查看它绑定到的对象。希望这有所帮助...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接