WPF:如何让Contextmenu选择并忘记?

时间:2010-04-28 08:01:30

标签: .net wpf contextmenu

我有一个带有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>

2 个答案:

答案 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。