0

我的视图模型上有一个属性“模式”。每当此属性更改时,我想查看它是否等于上下文菜单中的任何菜单项标题。如果相等,我希望将该菜单项的 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>
4

1 回答 1

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

于 2013-07-23T13:29:04.097 回答