2010-10-12 69 views
0

我尝试获取在其Convert函数中调用转换器的元素。如何获取WPF转换器的调用者?

原因是,我有一个TreeViewItems的样式,并希望将BackgroundColor绑定到内容(如果有子项或不)。因此,我需要转换器,他需要知道对应项目包含的内容,因此在我看来,他认为他会打电话给他。

这里我的风格:

 <Style TargetType="{x:Type TreeViewItem}"> 
     <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> 
     <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
     <Setter Property="Background" Value="Transparent"/> 
     <Setter Property="HorizontalContentAlignment" Value="{Binding Path=HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
     <Setter Property="Padding" Value="1,0,0,0"/> 
     <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
     <Setter Property="FocusVisualStyle" Value="{StaticResource TreeViewItemFocusVisual}"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type TreeViewItem}"> 
        <StackPanel> 
         <Border Name="Bd" Background="{TemplateBinding Background, Converter={StaticResource NodeBackgroundConverter}}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"> 
          <Grid Margin="{Binding Converter={StaticResource lengthConverter}, 
                  RelativeSource={RelativeSource TemplatedParent}}"> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="19" /> 
            <ColumnDefinition /> 
           </Grid.ColumnDefinitions> 
           <ToggleButton x:Name="Expander" 
                 Style="{StaticResource ExpandCollapseToggleStyle}" 
                 IsChecked="{Binding Path=IsExpanded, 
                 RelativeSource={RelativeSource TemplatedParent}}" 
                 ClickMode="Press"/> 
           <ContentPresenter x:Name="PART_Header" 
                  Grid.Column="1" 
                  ContentSource="Header" 
                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/> 
          </Grid> 
         </Border> 
         <ItemsPresenter x:Name="ItemsHost"/> 
        </StackPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

现在的问题是如何做到这一点,利用 “NodeBackgroundConverter”。

THX

回答

2

你为什么不使用StyleSelector类

1-创建2个款式

1.1 - 一个用于simpel树型视图 1.2 - 一个具有树型视图的子项

2-比创建从StyleSelector继承的类

3重写SelectStyle方法

public class SeparatorTabStyleSelector : StyleSelector 
{ 
    #region " StyleSelector Implementation " 

    public override Style SelectStyle(
     object item, 
     DependencyObject container) 
    { 
     object data = item as 'Your Bindable Object'; 
     if ('Your Condition Based upon item object') 
     { 
      return (Style)((FrameworkElement)container).FindResource("Style1"); 
     } 
     else if ('If Condition is not true Based upon item object') 
     { 
      return (Style)((FrameworkElement)container).FindResource("Style2"); 
     } 

     return base.SelectStyle(item, container); 
    } 

    #endregion " StyleSelector Implementation " 

} 
0

尝试使用绑定到HasItems属性的DataTrigger。

<DataTrigger Property="{Binding Path=HasItems}" Value="True"> 
    <Setter Property="DataTemplate" Value="{StaticResource subitemtemplate}" /> 
</DataTrigger> 

在DataTemplate中设置为其他模板样式的模板将被替换时,TreeView控件有一个子项

+0

好吧,如果我有三个两个以上的级别,将无法正常工作这需要有不同的颜色。 – Tokk 2010-10-12 11:16:25

+0

是的,将触发器绑定到布尔属性的选项有限,但您可以轻松地绑定到datacontext上的属性以进行此确定,如枚举。再加上你的问题确实如此:如果有子项或没有 – benPearce 2010-10-12 11:31:09