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

本文关键字:触发器 绑定 转换器 WPF 是否 | 更新日期: 2023-09-27 18:19:46

我得到了以下TabItem模板,其中TabItem包含一个图像,其来源取决于IsSelected属性。我通过将Image.Source绑定到TabItem.Header,并使用Converter将标题文本转换为完整的文件名来实现这一点。(即,"awb"的标题将变为"images/awbwhite.png"或"images/awpblack.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>

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

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

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