我有以下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>
答案 0 :(得分:2)
据我所知,这是不可能的。
但您可以通过仅创建一个转换器来改变处理方式,但通过MultiBinding
传递原始值和选择状态。 (转换器需要是IMultiValueConverter
)。这是否是一个好主意当然是值得怀疑的......