Команда привязки к MenuItem с использованием HierarchicalDataTemplate - PullRequest
0 голосов
/ 15 марта 2011

В настоящее время у меня есть древовидная структура, которая отображает данные с использованием иерархической таблицы данных, и когда пользователь нажимает кнопку «Удалить», он удаляет выбранные узлы.Это работает как задумано.

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

Этооказывается гораздо сложнее, потому что он выбирается ViewModel узла (который ничего не знает о View) вместо соответствующего ViewModel View.

Есть ли способ передать элемент управлениявместо этого к ViewModel представления?

Вот код для кнопки удаления:

View:

        <Button Content="Remove" Grid.Row="2" Height="23" VerticalAlignment="Top" Name="removeButton" 
                Width="75"  Margin="5,20,5,0"  Command="{Binding Path=RemoveCommand}" />

ViewModel:

public RelayCommand RemoveCommand
        {
            get
            {
                if (_removeCommand == null)
                {
                    _removeCommand = new RelayCommand(
                        () => this.Remove()
                        );
                }
                return _removeCommand;
            }
        }

        public void Remove()
        {
            _organLocationTree2.RemoveOrganLocations(ProjectOrganLocationView.GetExtendedTreeView().SelectedItems);
            ProjectOrganLocationView.GetExtendedTreeView().SelectedItems.Clear();

            base.RaisePropertyChanged("DestOrganTree");
        }

И XAML для пункта меню:

            <local:ExtendedTreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding SubOrganLocations}">
                    <TextBlock Text="{Binding OrganName}" >
            <TextBlock.ContextMenu>
                <ContextMenu>
                    <MenuItem Header ="Add SubNode" Command="{Binding Path=MenuItem_Add}"></MenuItem>
                    <MenuItem Header ="Remove Node" Command="{Binding Path=RemoveCommand}"></MenuItem>
                    <MenuItem Header ="Edit Node" Command="{Binding Path=ProjMenuItem_Edit}"
                              CommandParameter="{Binding DestOrganTree, Path=Selected.OrganName}"></MenuItem>
                </ContextMenu>
            </TextBlock.ContextMenu>
                    </TextBlock>
                </HierarchicalDataTemplate>
            </local:ExtendedTreeView.ItemTemplate>
        </local:ExtendedTreeView>

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

1 Ответ

2 голосов
/ 15 марта 2011

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

Вот мой обновленный xaml для всех, у кого есть эта проблема:

 <local:ExtendedTreeView.ContextMenu>
                        <ContextMenu>
                            <MenuItem Header ="Add SubNode" Command="{Binding Path=MenuItem_Add}"></MenuItem>
                            <MenuItem Header ="Remove Node" Command="{Binding Path=RemoveCommand}"></MenuItem>
                            <MenuItem Header ="Edit Node" Command="{Binding Path=ProjMenuItem_Edit}"
                                      CommandParameter="{Binding DestOrganTree, Path=Selected.OrganName}"></MenuItem>
                        </ContextMenu>                        
                    </local:ExtendedTreeView.ContextMenu>

                    <local:ExtendedTreeView.ItemTemplate>
                        <HierarchicalDataTemplate ItemsSource="{Binding SubOrganLocations}">
                            <TextBlock Text="{Binding OrganName}" >
                            </TextBlock>
                        </HierarchicalDataTemplate>
                    </local:ExtendedTreeView.ItemTemplate>
...