我尝试在其转换函数中获取调用转换器的元素。
原因是,我有一个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
答案 0 :(得分:2)
为什么不使用StyleSelector类
1-创建2个样式
1.1 - 一个用于simpel treeviewitem 1.2 - 一个用于具有子项目的treeviewitem
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 "
}
答案 1 :(得分:0)
尝试使用绑定到HasItems属性的DataTrigger。
<DataTrigger Property="{Binding Path=HasItems}" Value="True">
<Setter Property="DataTemplate" Value="{StaticResource subitemtemplate}" />
</DataTrigger>
在样式中将DataTemplate设置为另一个模板,当TreeView具有子项时,模板将被替换