带边框的DataTemplate需要根据父控件更改背景

时间:2014-06-06 04:51:12

标签: wpf wpf-controls wpf-4.0

控件内的datatemplate边框需要根据情况更改其背景画笔。

由于我的代码在工作,我在家试图回忆结构,为伪编码道歉。

它看起来像:

<parent control>

 <custom:controlwithdatatemplate needs Border background to be green/>

 <custom:controlwithdatatemplate needs Border background to be red/>

</parent conrol>

在datatemplate中:

<dataTemplate>

 <Border Background="{Binding RelativeSource, findancestor x:Type Border??}"

</dataTemplate>

所以我的猜测是设置边界动态的绑定条件(也许找到Border Type的祖先)。但由于在父控件上设置边框样式可能不会传递到子xaml的datatemplate,我不确定这是否是正确的方法。将brush作为依赖属性公开是唯一的方法吗?我可以以某种方式在父xaml和控件的每个datatemplate中提供两种不同的资源或样式来绑定父xaml中的不同资源/样式吗?

----------- EDIT -------------------

虽然我正在寻找另一种方式而不是使用依赖属性,但我仍然从下面的线程中选择了答案,因为它解决了上述问题,现在无法想到更好的方法。

2 个答案:

答案 0 :(得分:1)

<Border Background="{Binding Path=Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Border}}}" />

EDIT -------------------------------

澄清之后:

<ParentControl>
   <ParentControl.Resources>
       <SolidColorBrush x:Key=firstBrush Color="Red" />
       <SolidColorBrush x:Key=secondBrush Color="Blue" />
    </ParentControl.Resources>

    <ChildControl BorderBrush="{DynamicResource firstBrush} />
    <ChildControl BorderBrush="{DynamicResource secondBrush} />

</ParentControl>

<ChildControl>
 <DataTemplate>
  <...>
   <Border Background="{Binding Path=BorderBrush, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ParentControl}}}" />
  </...>
 </DataTemplate>
</ChildControl>

在ChildControl中,您需要定义类型画笔的DP。

答案 1 :(得分:0)

我想,你在寻找datatrigger,

           <DataTemplate>
                <Border Background="Red" x:Name="bor"/>
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding SomeProperty, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type YouParentType}}}"
                             Value="SomeValue">
                        <Setter Property="Background"
                                Value="Green"
                                TargetName="bor" />
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>