从数据模板设置父控件的属性

时间:2010-12-06 11:14:17

标签: wpf xaml

如何从数据模板设置父/祖先控件的属性?

我能想到的唯一方法是在我的表单上创建一个虚拟的不可见控件,然后使用转换器,onewaytosource和relativesource findancestor绑定将其中一个属性与正确的默认值绑定,这是一个非常可怕的解决方案。

我想做的是能够让setter目标成为一个不同的控件,就像使用不同来源的绑定一样。

2 个答案:

答案 0 :(得分:0)

几种可能的选择: 1)在DataTemplate内部的绑定中,使用ElementName将源设置为父级,并使用OneWayToSource进行绑定。这会将绑定目标(DataTemplate中的元素)的值传递给绑定源(父控件) 2)使用DataTemplate和控件绑定的公共对象。 DataTemplate将使用OneWayToSource绑定到它,控件将使用OneWay绑定到它。它甚至可以是资源,因此您可以从XAML访问它。 3)使用RelativeSource和FindAncestor。 4)使用某种路由事件,并在控制级别处理它。它将通过附加行为从Google数据模板中触发(google it!)。事件将传递数据,事件处理程序将在控件上设置相关属性。

选项1,3与您的建议类似。选项2,4是不同的。在优雅方面,我更喜欢选项2。

此外 - 请注意所有解决方案中的冲突。如果DataTemplate在单个控件内多次实例化,则所有实例都将尝试设置控件的属性。效果将是上次执行的集合尝试的效果,如果您无法控制其顺序,则在某些情况下可能会出现问题。

亚历。

答案 1 :(得分:0)

假设您的祖先是数据模板的内部,您可以使用“名称”属性为该祖先命名。一旦有了名称,就可以使用setter的“TargetName”来指定祖先。

示例:

<DataTemplate>
    <Grid Name="ControlGrid">
        <Path x:Name="Arrow" Fill="Black">
            <Path.Triggers>
                <Trigger Property="IsEnabled" Value="false">
                    <Setter Property="Visibility" TargetName="ControlGrid" Value="Collapsed"/>
                </Trigger>
            </Path.Triggers>
        </Path>
    </Grid>
</DataTemplate>
相关问题