Вопрос

у меня есть TreeView настроить так, чтобы каждый TreeViewItem имеет контекстное меню, вызываемое правой кнопкой мыши, применяемое в качестве Style.Что-то вроде:

<Grid.Resources>
    <ContextMenu x:Key="contextMenu">
         <MenuItem Header="Save"  IsEnabled="{Binding Path=Saveable}"/>
         <MenuItem Header="Copy" IsEnabled="{Binding Path=Copyable}"/>
         <MenuItem Header="Remove" IsEnabled="{Binding Path=Removeable}"/>
    </ContextMenu>
    <Style TargetType="TreeViewItem">
        <Setter Property="ContextMenu" Value="{StaticResource contextMenu}" />
    </Style>
</Grid.Resources>

Saveable, Copyable и Removeable — это свойства, которые берутся из объекта, который используется в качестве TreeViewItem.

Я ищу, когда пользователь нажимает на MenuItem, он щелкнет соответствующий метод выбранного объекта.Итак, нажимаем «Сохранить» MenuItem назвал бы object.Save(), «Копировать» звонки object.Copy(), и т. д.Но я не уверен, как будет выглядеть синтаксис и приемлема ли эта идея с точки зрения типичного стиля WPF.Я знаю, что могу просто создать новый обработчик событий в окружающем окне, но я бы предпочел, чтобы событие обрабатывал сам выбранный элемент.

Мысли?

Спасибо!

Это было полезно?

Решение

К сожалению, я не думаю, что существует автоматизированный способ сделать это.Ближайшим вариантом будет установка RoutedUICommand за каждый товар в ContextMenu, а затем создайте CommandBinding для каждого в вашем классе.Если вы хотите, чтобы они пошли в TreeViewItem, вам, вероятно, понадобится создать подкласс TreeViewItem и настроить CommandBindings там.

Единственный вариант, который, по моему мнению, мог бы сработать, — это добавить EventSetter для MenuItem.Click к TreeViewItem стиль.Однако это не сработало - возможно, потому, что элементы в ContextMenu находятся в другом визуальном дереве, чем TreeViewItems.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top