当视图模型属性等于菜单项的标题时触发

时间:2013-07-22 21:25:53

标签: mvvm binding triggers menuitem datatrigger

我的视图模型上有一个属性“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>

1 个答案:

答案 0 :(得分:1)

您可以使用MultiValueConverter。

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中的代码。