基于viewmodel属性绑定更改MenuItem标头和图标

时间:2016-07-21 16:04:44

标签: wpf datatemplate menuitem datatrigger

我无法弄清楚如何做到这一点,人们会认为这很简单。

我有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>

MenuItem

1 个答案:

答案 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>