我无法弄清楚如何做到这一点,人们会认为这很简单。
我有MenuItem
这是ContextMenu
的一部分。我在viewmodel上有一个binding
到布尔属性。根据此属性的状态,我希望MenuItem
的标题文本和图标更改。
我当然可以使用IValueConverter
,但我确信使用DataTemplate
和触发器有更优雅的解决方案。我无法弄清楚正确的标记。
我编写的代码(在下面剪辑)有两个问题:HeaderTemplate
似乎没有包含图标,因此MenuItems
的文本包含图标(通常左侧部分显示图标 - 参见图像并与“复制”和“清除”菜单项进行比较)。此外,单击MenuItem
不会触发DataTemplate
更改(请注意命令有效,视图模型绑定实际上会切换真/假状态)。
<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>
答案 0 :(得分:2)
<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>