1

Пока не щелкну по item-у TreeView, контекстное меню на пустом месте TreeView появляется но не активно.

Не активное контекстное меню

Но после щелчка по item-у в TreeView правой или левой кнопкой - все нормально, теперь по щелчку на пустом месте в TreeView контекстное меню активно.

Активное контекстное меню

С чем это может быть связано? Вот код:

            <TreeView x:Name="tv"
                      ItemsSource="{Binding Kateg}">
            &lt;TreeView.ItemTemplate&gt;
                &lt;HierarchicalDataTemplate ItemsSource=&quot;{Binding Node}&quot; &gt;
                    &lt;Border&gt;
                        &lt;Grid&gt;
                            &lt;Grid.ColumnDefinitions&gt;
                                &lt;ColumnDefinition Width=&quot;450&quot;/&gt;
                                &lt;ColumnDefinition Width=&quot;50&quot;/&gt;
                                &lt;ColumnDefinition Width=&quot;100&quot;/&gt;
                            &lt;/Grid.ColumnDefinitions&gt;

                            &lt;Grid.InputBindings&gt;
                                &lt;MouseBinding Gesture=&quot;RightClick&quot;
                                                    Command=&quot;vm:GenViewModel.PkmNode&quot;
                                                    CommandParameter=&quot;{Binding}&quot;/&gt;

                                &lt;MouseBinding Gesture=&quot;LeftClick&quot;
                                                    Command=&quot;vm:GenViewModel.LkmNode&quot;
                                                    CommandParameter=&quot;{Binding}&quot;/&gt;
                            &lt;/Grid.InputBindings&gt;

                            &lt;TextBlock Name=&quot;Nap&quot; Grid.Column=&quot;0&quot; Text=&quot;{Binding Name, UpdateSourceTrigger=PropertyChanged}&quot;/&gt;
                            &lt;TextBlock Name=&quot;KZ&quot;  Grid.Column=&quot;1&quot; Text=&quot;{Binding KZ, UpdateSourceTrigger=PropertyChanged}&quot;/&gt;
                            &lt;TextBlock Name=&quot;SZ&quot;  Grid.Column=&quot;2&quot; Text=&quot;{Binding SZ, UpdateSourceTrigger=PropertyChanged}&quot;/&gt;
                        &lt;/Grid&gt;

                        &lt;Border.ContextMenu&gt;
                            &lt;ContextMenu DataContext=&quot;{StaticResource ContMenu}&quot;&gt;
                                &lt;MenuItem Header=&quot;Создать&quot; 
                                    Command=&quot;vm:GenViewModel.CreateNode&quot; 
                                    CommandParameter=&quot;{Binding}&quot;/&gt;
                                &lt;MenuItem Header=&quot;Изменить&quot; 
                                    Command=&quot;vm:GenViewModel.UpdateNode&quot;
                                    CommandParameter=&quot;{Binding}&quot;/&gt;
                                &lt;MenuItem Header=&quot;Удалить&quot; 
                                    Command=&quot;vm:GenViewModel.DeleteNode&quot;
                                    CommandParameter=&quot;{Binding}&quot;/&gt;
                            &lt;/ContextMenu&gt;

                        &lt;/Border.ContextMenu&gt;
                    &lt;/Border&gt;

                &lt;/HierarchicalDataTemplate&gt;
            &lt;/TreeView.ItemTemplate&gt;

            &lt;TreeView.ContextMenu&gt;
                &lt;ContextMenu &gt;
                    &lt;MenuItem Header=&quot;Создать&quot;
                                Command=&quot;vm:GenViewModel.CreateNode&quot; 
                                CommandParameter=&quot;{Binding}&quot;/&gt;
                &lt;/ContextMenu&gt;
            &lt;/TreeView.ContextMenu&gt;
        &lt;/TreeView&gt;
    &lt;/Border&gt;


<Style TargetType="ContextMenu"> <Setter Property="Cursor" Value="Hand"/> <Setter Property="Foreground" Value="{StaticResource CMI.Foreground}"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ContextMenu}"> <Border x:Name="Border" Background="{StaticResource Background.Title}"
BorderThickness="1" BorderBrush="{StaticResource CMI.BorderBrush}"> <StackPanel IsItemsHost="True"/> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style>

    static RoutedUICommand createNode;
    public static RoutedUICommand CreateNode
    {
        get
        {
            if (createNode == null)
                createNode = new RoutedUICommand(&quot;createNode&quot;, &quot;CreateNode&quot;, typeof(GenViewModel));
            return createNode;
        }
    }

  • 1
    За активность MenuItem у вас отвечает выражение CanExecute команды, которое вы не показали. И не понятно, зачем вы биндите одновременно и правую кнопку, и добавляете контекстное меню. – aepot Nov 29 '20 at 20:53
  • За биндинг правой кнопки вы справедливо подметили, уже исправил. Просто изменял код и пропустил. Но проблема осталась. По поводу 'CanExecute' - все имеется, вот: cm = new CommandBinding(); cm.Command = CreateNode; cm.CanExecute += naprVM.Cm_CanExecute; cm.Executed += naprVM.CreateNode; – Алекс Дронго Nov 29 '20 at 22:00
  • И что возвращает Cm_CanExecute? – aepot Nov 29 '20 at 22:06
  • ` public void Cm_CanExecute(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = true; } – Алекс Дронго Nov 29 '20 at 22:08
  • Окей, а реализация класса CanExecuteRoutedEventArgs есть? Вообще я совсем по-другому команды использую, но не суть. Факт в том что когда ваше меню неактивно, значит интерфейс при запросе CanExecute команды получил false, или null. И это, исходя из того, что вы показали, где во внутренностях реализации вашей команды зашито. Что за фреймворк команд используете? В первый раз такое вижу с событиями. – aepot Nov 29 '20 at 22:12
  • Нашел, попробуйте забрать к себе в проект класс RelayCommand и реализовать свойство с командой, по примеру как я там же показываю. – aepot Nov 29 '20 at 22:21
  • Реализации класса CanExecuteRoutedEventArgs нет. Фреймворк команд не использую. Спасибо за отзыв, завтра почитаю ваш пример. – Алекс Дронго Nov 29 '20 at 22:21

0 Answers0