【问题标题】:Binding to Template's parent's parent's child's property绑定到模板的 parent 的 parent 的 child 的 property
【发布时间】:2016-08-11 18:59:21
【问题描述】:

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

我希望内容模板中的一个 TextBlock 与标题的 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,但我只希望内容中的一列与标题的颜色匹配,而不是整个扩展器。

我也可以对 Content TextBlock 上的 Header TextBlock 应用相同的触发器,但我想看看是否有办法避免重复代码。

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

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

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

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

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

    2. 如果它会改变,请将两者都绑定到视图模型的画笔属性(有点笨拙,但不是世界末日),或者使用由其他视图模型属性驱动的触发器,该属性表示颜色指示的状态。触发器将引用任意数量的适当命名的Brush 资源:ErrorBrushHappyBrushSadBrush 等。“名称”当然是指x:Key

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

      ...等等。

    【讨论】:

      猜你喜欢
      • 2018-06-16
      • 2013-07-30
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多