Почему у вас есть 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.
}