是否可以在WPF中更改触发器中的绑定转换器?

时间:2012-01-09 16:42:40

标签: c# wpf xaml

我有以下TabItem模板,其中TabItem包含的图片的来源取决于IsSelected属性。我通过将Image.Source绑定到TabItem.Header并使用Converter将标题文本转换为完整文件名来实现此目的。 (即“awb”的标题将变为“images / awb-white.png”或“images / awb-black.png”,具体取决于转换器)。

此代码有效,但似乎有一些不必要的冗余。我真正需要改变的是Image.Source的绑定转换器;不是整个绑定本身。 (RelativeSource和Path都保持不变)。有没有办法在没有冗余的情况下实现这一目标?

<Window.Resources>
    <local:UnselectedImageFilenameConverter x:Key="UnselectedImageFilenameConverter" />
    <local:SelectedImageFilenameConverter x:Key="SelectedImageFilenameConverter" />
    <ControlTemplate TargetType="TabItem" x:Key="TabItemTemplate">
        <Image x:Name="TabImage" Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Header, Converter={StaticResource UnselectedImageFilenameConverter}}" Stretch="None"/>
        <ControlTemplate.Triggers>
            <Trigger Property="Selector.IsSelected" Value="True">
                <Setter TargetName="TabImage" Property="Source" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Header, Converter={StaticResource SelectedImageFilenameConverter}}"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
</Window.Resources>
<TabControl>
    <TabItem Header="awb" Template="{StaticResource TabItemTemplate}">
        <Grid/>
    </TabItem>
    <TabItem Header="av" Template="{StaticResource TabItemTemplate}">
        <Grid/>
    </TabItem>
</TabControl>

1 个答案:

答案 0 :(得分:2)

据我所知,这是不可能的。

但您可以通过仅创建一个转换器来改变处理方式,但通过MultiBinding传递原始值和选择状态。 (转换器需要是IMultiValueConverter)。这是否是一个好主意当然是值得怀疑的......