Определение контекстных меню для WPF TreeView - PullRequest
0 голосов
/ 02 июня 2010

Я дал моему WPF TreeView контекстное меню:

<TreeView ContextMenuOpening="TreeView_ContextMenuOpening">
    <TreeView.ContextMenu>
        <ContextMenu>
            <MenuItem Name="NewInputMenuItem" Header="Add" Click="AddInputMenuItem_Click" />
            <MenuItem Name="RemoveInputMenuItem" Header="Remove" Click="RemoveInputMenuItem_Click" />
        </ContextMenu>
    </TreeView.ContextMenu>
    <!-- etc... -->
</TreeView>

Я определил контекстное меню для TreeView, а не TreeViewItem, поскольку я хочу, чтобы одно и то же контекстное меню отображалось независимо от того, выбран элемент или нет, однако я хочу, чтобы пункт меню «Удалить» быть включенным, только если пользователь щелкнул правой кнопкой мыши на элементе, а не только на пустом месте в меню.

Способ, которым я сейчас занимаюсь, заключается в использовании свойства выбранного элемента TreeView (в обработчике события TreeView_ContextMenuOpening), однако проблема заключается в том, что щелчок правой кнопкой мыши по элементу представления дерева открывает контекстное меню. для этого вида дерева без изменения выбранного состояния элемента вида дерева.

Кроме того, я не могу не думать, что все вышеперечисленное очень не похоже на WPF, поэтому:

  • Как сделать так, чтобы, когда пользователь щелкнул правой кнопкой мыши элемент дерева, этот элемент был выбран.
  • И есть ли лучший способ достижения вышеуказанного?

1 Ответ

0 голосов
/ 02 июня 2010

Команды WPF очень полезны в этой ситуации.Я думаю, вам лучше привязать каждый ваш элемент MenuItem к команде.Таким образом, в каждой команде вы можете определить, когда эту команду можно выполнить.WPF автоматически проверяет, может ли каждая команда выполняться во время выполнения.если какой-либо из них не может быть оправдан, связанный с ним элемент управления автоматически отключается.здесь вы можете использовать этот пример кода в качестве метода CanExcute для команды удаления в древовидном представлении:

private bool CanExcute()
{
    if (MyTreeView.SelectedItem != null)
       return true;
    else
       return false;
}

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

...