Mvvm 当视图模型属性等于菜单项';s头

Mvvm 当视图模型属性等于菜单项';s头,mvvm,binding,triggers,menuitem,datatrigger,Mvvm,Binding,Triggers,Menuitem,Datatrigger,我的视图模型上有一个属性“Mode”。每当这个属性改变时,我想看看它是否等于上下文菜单中的任何菜单项标题。如果它相等,我希望该菜单项的IsChecked属性设置为true。如何做到这一点 我尝试使用以下行设置值: ({Binding RelativeSource={RelativeSource Self}, Path=Header}) 但不能对值使用绑定。以下是我剩余的尝试,当前值为空: <ContextMenu> <ContextMenu.ItemContainer

我的视图模型上有一个属性“Mode”。每当这个属性改变时,我想看看它是否等于上下文菜单中的任何菜单项标题。如果它相等,我希望该菜单项的IsChecked属性设置为true。如何做到这一点

我尝试使用以下行设置值:

({Binding RelativeSource={RelativeSource Self}, Path=Header})
但不能对值使用绑定。以下是我剩余的尝试,当前值为空:

<ContextMenu>
    <ContextMenu.ItemContainerStyle>
       <Style TargetType="{x:Type MenuItem}">
           <Setter Property="IsChecked" Value="False" />
           <Style.Triggers>
                <DataTrigger Binding="{Binding Mode}" Value="???">
                     <Setter Property="IsChecked" Value="True"></Setter>
                </DataTrigger>
            </Style.Triggers>
       </Style>
    </ContextMenu.ItemContainerStyle>
    <MenuItem Header="{x:Static Name:ContextMenuStartNames.1}"/>
    <MenuItem Header="{x:Static Name:ContextMenuStartNames.1}"/>
    <MenuItem Header="{x:Static Name:ContextMenuStartNames.3}"/>
</ContextMenu>

您可以使用多值转换器

public class ModeMultiConverter:IMultiValueConverter 
{
    #region Implementation of IMultiValueConverter

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values.Length != 2 || values[0] == null || values[1] == null)
            return Binding.DoNothing;

        var mode = values[0].ToString();
        var header = values[1].ToString();
        return mode == header;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}
在Xaml中:

<MenuItem.IsChecked>
    <MultiBinding Converter="{StaticResource ModeMultiConverter}" Mode="OneWay">
        <Binding Path="PlacementTarget.DataContext.Mode" RelativeSource="{RelativeSource AncestorType=ContextMenu}"/>
        <Binding Path="Header" RelativeSource="{RelativeSource Self}"/>
    </MultiBinding>
</MenuItem.IsChecked>

您可以删除ItemContainerStyle中的代码