应该更改 Image.Source 属性 的图像上的 DataTrigger 不起作用

DataTrigger on an Image that should change the Image.Source property does not work

我将此 question/answer 转载如下:

            <Button Command="Play" ToolTip="Execute Macro">
                <Image DataContext="{Binding ElementName=UserControlMacroEdit}" Source="/ParametricStudySharedGui;component/Image/arrowRight32x32.png" Height="24" Width="24">
                    <Image.Style>
                        <Style TargetType="{x:Type Image}">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding IsMacroRunning, Converter={StaticResource FakeTransparentConverter}, Mode=OneWay}" Value="True">
                                    <DataTrigger.Setters>
                                        <Setter Property="Source" Value="/ParametricStudySharedGui;component/Image/Run24.png"></Setter>
                                        <Setter Property="Opacity" Value=".5"></Setter>
                                    </DataTrigger.Setters>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </Image.Style>
                </Image>
            </Button>

但是,有一个奇怪的行为。 "Opacity" 已更改,但图像本身保持不变。看起来我无法从 DataTrigger 修改 Image.Source。为什么?

由于依赖属性的处理方式,您的原始代码无法正常工作。特别是,由于可以从多个位置设置它们,WPF 为此类属性实现了 "priority" 的想法。 "Locally set" 属性(即它们被设置为 XAML 中元素声明的一部分)比样式中的任何 setter 具有更高的优先级。

详情请见Dependency Property Value Precedence

您可以通过在 Style 本身中初始化 Source 属性 而不是作为 Image 声明的一部分来解决此问题:

            <Image DataContext="{Binding ElementName=UserControlMacroEdit}" Height="24" Width="24">
                <Image.Style>
                    <Style TargetType="{x:Type Image}">
                        <Setter Property="Source" Value="/ParametricStudySharedGui;component/Image/arrowRight32x32.png"></Setter>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding IsMacroRunning, Converter={StaticResource FakeTransparentConverter}, Mode=OneWay}" Value="True">
                                <DataTrigger.Setters>
                                    <Setter Property="Source" Value="/ParametricStudySharedGui;component/Image/Run24.png"></Setter>
                                    <Setter Property="Opacity" Value=".5"></Setter>
                                </DataTrigger.Setters>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Image.Style>
            </Image>