绑定到模板的父母的父母的财产

时间:2016-08-11 18:59:22

标签: wpf xaml

我有一个扩展器样式,它在标题和内容上都应用了模板

我希望其中一个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应用相同的触发器,但我试图看看是否有办法避免重复代码。

1 个答案:

答案 0 :(得分:0)

ElementName无法跨模板工作;使用模板,您可以拥有多个具有相同名称的元素。

任何具有不同模板实例的东西都可以通过可视化树互相摸索,无论你做什么,都会充满nameless horrors

相反,我建议他们都从相同的来源获得他们的画笔。这更符合WPF乐意做事的方式。

  1. 如果颜色不会改变,请为两者使用适当命名的Brush资源。

  2. 如果它会改变,请将两者绑定到一个viewmodel Brush属性(有点怪,但不是世界末尾),或者使用由其他viewmodel属性驱动的触发器,该属性表示颜色指示的状态。触发器将引用任意数量的适当命名的Brush资源:ErrorBrushHappyBrushSadBrush等。通过&#34; name&#34;我的意思是x:Key当然:

    <SolidColorBrush x:Key="HappyBrush">GreenYellow</SolidColorBrush>
    

    ...等