代码之家  ›  专栏  ›  技术社区  ›  Tokk

如何获取WPF转换器的调用方?

  •  0
  • Tokk  · 技术社区  · 14 年前

    我尝试在convert函数中获取调用converter的元素。

    原因是,我有TreeView项目的样式,并且希望将背景颜色绑定到内容(如果有子项目或没有)。因此,我需要一个转换器,他需要知道对应的项目包含什么,因此在我看来,他必须知道他的呼叫者。

    这里是我的风格:

            <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”来实现这一点。

    谢谢

    2 回复  |  直到 14 年前
        1
  •  2
  •   TalentTuner    14 年前

    为什么不使用StyleSelector类

    1-创建2个样式

    1.1-一个用于Simpel TreeView项目 1.2-一个用于具有子项的树视图项

    2-创建从样式选择器继承的类

    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 "
    
    }
    
        2
  •  0
  •   benPearce    14 年前

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

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

    在样式中将DataTemplate设置为其他模板中,当TreeView具有子项时,将替换该模板。