我的视图模型上有一个属性“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>
答案 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中的代码。