WPF: Как сделать ContextMenu выбранным и забыть? - PullRequest
0 голосов
/ 28 апреля 2010

У меня есть ContextMenu с ListBox внутри. Всякий раз, когда я щелкаю правой кнопкой мыши по своему элементу управления и выбираю значение из контекстного меню, последнее выбранное значение остается отмеченным, и я не могу выбрать это значение снова.

Идея состоит в том, что я могу выбрать одно и то же значение в текстовом меню, чтобы включить или отключить свойство.

Должно быть довольно просто, чего мне не хватает?

Большое спасибо,

РЕДАКТИРОВАТЬ: Спасибо за ответы. Я пытался применить ваши идеи без успеха. Я думаю, что основная проблема заключается в том, что у MenuItems контекстного меню нет ItemSource для привязки к коллекции (например, AdditionalValues, как в этом примере).

Могу ли я вставить свой код для уточнения:

    <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 ]

2 голосов
/ 28 апреля 2010

Почему у вас есть ListBox в вашем ContextMenu? ListBox позволяет выбрать один элемент из списка (или несколько элементов, если они включены). Примером является список файлов в Проводнике.

ContextMenu - это ItemsControl, т.е. Вы можете добавить произвольное количество элементов к нему. Так что просто добавьте предметы напрямую.

РЕДАКТИРОВАТЬ: оба ContextMenu и MenuItem являются ItemsControl. Они оба имеют свойство ItemsSource. Таким образом, вы могли бы иметь следующее:

<ContextMenu
    DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DataContext}"
    ItemsSource="{Binding Path=PossibleValues}"/>

Возможные значения могут быть коллекцией MenuItems. Каждый пункт меню может выглядеть следующим образом (здесь в коде), например:

var menuItem = new MenuItem();
menuItem.Items.Add(new TextBlock { Text = "Something" });
menuItem.Command = DoSomethingCommand;
menuItem.CommandParameter = "identifier";

РЕДАКТИРОВАТЬ 2: Попробуйте что-то вроде следующего. В качестве команды вы можете использовать одну из многих реализаций из вспомогательных библиотек MVVM, например DelegateCommand <> из Prism или SimpleCommand из Cinch .

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.
}
0 голосов
/ 28 апреля 2010

Это ожидаемое поведение элемента управления ListBox - не имеет значения, что он находится в ContextMenu. Поведение ListBox по умолчанию не позволяет отменять выбор элементов; то, что вы, вероятно, захотите, это либо обычный элемент MenuKeck, который может быть разборным, либо ListBox с включенными сложными режимами выбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...