我有一个扩展器样式,它在标题和内容上都应用了模板
我希望其中一个TextBlock内容的模板与Header的TextBlock的前景色相匹配
<Style TargetType="Expander">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Foreground="Blue"/> <!--Header TextBlock-->
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<ItemsControl>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock/> <!--Match Header TextBlock's Foreground-->
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
我已经尝试了ElemenName绑定,但似乎名称范围不同,因为我是2模板级深度。
我想过TemplateBinding,但我只希望内容中的一列匹配标题的颜色而不是整个扩展器。
我也可以在内容TextBlock上为Header TextBlock应用相同的触发器,但我试图看看是否有办法避免重复代码。
答案 0 :(得分:0)
ElementName
无法跨模板工作;使用模板,您可以拥有多个具有相同名称的元素。
任何具有不同模板实例的东西都可以通过可视化树互相摸索,无论你做什么,都会充满nameless horrors。
相反,我建议他们都从相同的来源获得他们的画笔。这更符合WPF乐意做事的方式。
如果颜色不会改变,请为两者使用适当命名的Brush
资源。
如果它会改变,请将两者绑定到一个viewmodel Brush属性(有点怪,但不是世界末尾),或者使用由其他viewmodel属性驱动的触发器,该属性表示颜色指示的状态。触发器将引用任意数量的适当命名的Brush
资源:ErrorBrush
,HappyBrush
,SadBrush
等。通过&#34; name&#34;我的意思是x:Key
当然:
<SolidColorBrush x:Key="HappyBrush">GreenYellow</SolidColorBrush>
...等