我有一个带有ListBox的Contextmenu。每当我右键单击我的控件并从我的上下文菜单中选择一个值时,最后选择的值将保持标记状态,我无法再次选择该值。
我的想法是,我可以在COntextmenu中选择相同的值,以打开或关闭属性。
应该是非常基本的,我缺少什么?
非常感谢,
编辑:感谢您的回复。我试图用你的想法没有成功。我认为主要的问题是上下文菜单的MenuItem没有ItemSource绑定到集合(例如本例中的PossibleValues)。
我可以插入我的代码以澄清:
<Border.ContextMenu>
<ContextMenu>
<ContextMenu.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property ="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type MenuItem}">
<ContentPresenter x:name="Header" ContentSource="Header" RecognizesAccessKey="True"/>
</ControlTemplate>
</Setter.value>
</Setter>
</Style>
<ContextMenu.ItemContainerStyle>
<ListBox BorderThickness="0" Width="35" Margin="0"
SelectedItem="{Binding Path=Volume, Mode=TwoWay}
DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DataContext}"
ItemsSource="{Binding Path=PossibleValues}"/>
</ContextMenu>
</Border.ContextMenu>
答案 0 :(得分:2)
为什么ContextMenu中有ListBox? ListBox允许您从列表中选择一个项目(如果启用,则选择多个项目)。一个例子是资源管理器中的文件列表。
ContextMenu是ItemsControl,即。你可以添加任意数量的项目。所以只需直接添加项目。
编辑:ContextMenu和MenuItem都是ItemsControl。它们都有ItemsSource属性。所以你可以拥有以下内容:
<ContextMenu
DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DataContext}"
ItemsSource="{Binding Path=PossibleValues}"/>
PossibleValues可以是MenuItems的集合。每个menuitem可以查看以下内容(此处为代码),例如:
var menuItem = new MenuItem();
menuItem.Items.Add(new TextBlock { Text = "Something" });
menuItem.Command = DoSomethingCommand;
menuItem.CommandParameter = "identifier";
EDIT2:尝试以下内容。作为命令,您可以使用MVVM帮助程序库中的许多实现之一,例如DelegateCommand&lt;&gt;来自Prism或来自Cinch的SimpleCommand。
PossibleValues = new ObservableCollection<MenuItem>();
// null value
var nullMenuItem = new MenuItem();
nullMenuItem.Items.Add(new TextBlock { Text = "Null" });
nullMenuItem.Command = DoSomethingCommand;
nullMenuItem.CommandParameter = null;
PossibleValues.Add(nullMenuItem);
// Values one to nine
for (int i = 1; i < 9; i++)
{
var menuItem = new MenuItem();
menuItem.Items.Add(new TextBlock { Text = i.ToString() });
menuItem.Command = DoSomethingCommand;
menuItem.CommandParameter = i;
PossibleValues.Add(menuItem);
}
关于命令的执行处理程序,有以下几点:
public void DoSomethingCommand_Execute(object commandParameter)
{
this.SelectedNumber = commandParameter as int?;
// Or whatever you actually want to do in response to the selection.
}
答案 1 :(得分:0)
这是ListBox控件的预期行为 - 它与ContextMenu无关。 ListBox的默认行为不允许取消选择项目;你可能想要的是一个常规的chackable MenuItem,或者一个启用了复杂选择模式的ListBox。