ContextMenu, привязанное к ObservableCollection <MenuItem>, не обновляет данные - PullRequest
2 голосов
/ 02 февраля 2011

Учитывая следующий фрагмент XAML:

<UserControl.Resources>
    <ResourceDictionary>
        <Style x:Key="ContextMenuItemStyle">
            <Setter Property="MenuItem.Header" Value="{Binding Text}"/>
            <Setter Property="MenuItem.ItemsSource" Value="{Binding Children}"/>
            <Setter Property="MenuItem.Command" Value="{Binding Command}" />
        </Style>
       <ContextMenu x:Key="contextMenu" ItemsSource="{Binding MenuOptions}" ItemContainerStyle="{StaticResource ContextMenuItemStyle}" />
    </ResourceDictionary>
</UserControl.Resources>
<DockPanel>
    <TextBox Height="30" DockPanel.Dock="Top" ContextMenu="{StaticResource contextMenu}" />
    <Button Content="Add Menu Item" DockPanel.Dock="Top" Command="{Binding AddMenuItem}" />
 </DockPanel>

И Посмотреть модель:

public class MyViewModel {

    public ObservableCollection<MenuItem> DocumentExplorerMenuOptions { get; set; }
    MenuItem firstMenuItem;
    MenuItem secondMenuItem;

    public MyViewModel() {
      firstMenuItem = new MenuItem("First") { Command = new DelegatingCommand(x => MessageBox.Show("First Selected") };
      secondMenuItem = new MenuItem("Second") { Command = new DelegatingCommand(x => MessageBox.Show("Second Selected") };

      MenuOptions = new ObservableCollection<MenuItem> { firstMenuItem, secondMenuItem };
      AddMenuItem = new DelegateCommand<object>(x => firstMenuItem.Children.Add(
            new MenuItem("Child of First")));

    }
    public DelegateCommand<object> AddMenuItem { get; set; }
}

И класс:

public class MenuItem {
        public MenuItem(string text) {
            Text = text;
            Children = new List<MenuItem>();
        }
        public string Text { get; set; }
        public List<MenuItem> Children { get; private set; }
        public ICommand Command { get; set; }
    }

Нажатие кнопки делает добавление дочернего элемента в firstMenuItem, но не появляется в контекстном меню TextBox.

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

1 Ответ

0 голосов
/ 02 февраля 2011

Я бы не привязывался к коллекции MenuItems, а скорее к коллекции, управляемой данными, которая может содержать заголовок MenuItem, команду, которая выполняется при нажатии, и другую коллекцию таких элементов для подпунктов. Затем вы можете использовать (Иерархический) DataTemplate для создания меню на лету. Это, вероятно, решит проблемы обновления, если ваш тип данных реализует необходимые интерфейсы.

Редактировать: Кажется, у вас уже есть такой тип данных, не могли бы вы опубликовать его код?

Edit2: Я думаю, что проблема в том, что вы используете стиль, который нужно явно применить (он, вероятно, применяется только к главному контекстному меню, а не к подпунктам), как отмечалось ранее я бы предложил HierarchicalDataTemplate.

Edit3: lol ...

public List<MenuItem> Children { get; private set; }

Конечно, обновление не будет, если это List, а не ObservableCollection.

(Кстати, класс довольно плохо спроектирован, списки обычно не должны иметь даже частного установщика, это должны быть свойства, имеющие только метод получения поля readonly)

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