根据视图模型 属性 绑定更改 MenuItem header 和图标

Change MenuItem header and icon based on viewmodel property binding

我不知道该怎么做,有人会认为这很简单。

我有一个 MenuItem,它是 ContextMenu 的一部分。我在视图模型上有一个 binding 到一个布尔值 属性。根据此 属性 的状态,我希望 MenuItem 的 header 文本和图标发生变化。

我当然可以为此使用 IValueConverter,但我确信有一个使用 DataTemplate 和触发器的更优雅的解决方案。我只是想不出合适的标记。

我编写的代码(在下面截取)有两个问题:一个是 HeaderTemplate 似乎不包含图标,所以 MenuItems 的文本包含图标同样(通常图标出现在左侧部分 - 请参见图像并与复制和清除菜单项进行比较)。此外,单击 MenuItem 不会触发 DataTemplate 更改(请注意命令有效,viewmodel 绑定实际上会切换 true/false 状态)。

   <ContextMenu>
            <MenuItem Command="{Binding Source={x:Static cmd:Commands.PauseCommand}}"
                      CommandParameter="{Binding}">
                <MenuItem.HeaderTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Image x:Name="img" Source="../Icons/pause.png"/>
                            <TextBlock x:Name="txt" Text="Pause"/>
                        </StackPanel>
                        <DataTemplate.Triggers>
                            <DataTrigger Binding="{Binding IsPaused}" Value="True" >
                                <Setter Property="Image.Source" Value="../Icons/play.png" TargetName="img"/>
                                <Setter Property="Text" Value="Play" TargetName="txt"/>
                            </DataTrigger>
                        </DataTemplate.Triggers>
                    </DataTemplate>
                </MenuItem.HeaderTemplate>
            </MenuItem>

你是说这样?不要让事情变得比现在更难 ;)

<ContextMenu>
                        <MenuItem Command="{Binding Source={x:Static cmd:Commands.PauseCommand}}"
                  CommandParameter="{Binding}">
                            <MenuItem.Style>
                                <Style TargetType="MenuItem">
                                    <Setter Property="Icon" Value="../Icons/play.png>"></Setter>
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding IsPaused, Mode=OneWay}" Value="True">
                                            <Setter Property="Icon" Value="../Icons/pause.png"></Setter>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </MenuItem.Style>
                        </MenuItem>
                    </ContextMenu>