如何从数据模板设置父/祖先控件的属性?
我能想到的唯一方法是在我的表单上创建一个虚拟的不可见控件,然后使用转换器,onewaytosource和relativesource findancestor绑定将其中一个属性与正确的默认值绑定,这是一个非常可怕的解决方案。
我想做的是能够让setter目标成为一个不同的控件,就像使用不同来源的绑定一样。
答案 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>