Типы на WPF TreeView - PullRequest
       0

Типы на WPF TreeView

0 голосов
/ 25 апреля 2018

У меня есть вид дерева на одной из трех вкладок.Две другие вкладки содержат списки.Treeview имеет родителей и детей, только два слоя.(Не уверен в правильной терминологии здесь).

Когда пользователь нажимает на элемент в древовидном представлении, появляется контекстное меню с опциями New / Edit / Delete.Из-за двух других вкладок, использующих одно и то же Contextmenu, оно было реализовано особым образом. Здесь является фоном для этого.Родители имеют тип TemplateFamily, а дети имеют тип TemplateParameter.Я использую тег для отправки дополнительной информации, чтобы знать, с какой вкладки поступает запрос.

Вот wpf для TabItem:

<TabItem Header="Template Files" Height="22" VerticalAlignment="Top">
            <TreeView ItemsSource="{Binding TemplateFamilyList}" 
                      Margin="20"
                      ContextMenu="{StaticResource NewEditDeleteContextMenu}"
                      Tag="{x:Type domain:TemplateParameter}">
                <TreeView.Resources>
                    <HierarchicalDataTemplate DataType="{x:Type helper:TemplateFamily}"
                              ItemsSource="{Binding TemplateParameterMembers}" >
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Template.Name}" />
                            <TextBlock Text=" [" Foreground="Blue" />
                            <TextBlock Text="{Binding TemplateParameterMembers.Count}" Foreground="Blue" />
                            <TextBlock Text="]" Foreground="Blue" />
                        </StackPanel>
                        <HierarchicalDataTemplate.ItemContainerStyle>
                            <Style TargetType="{x:Type TreeViewItem}">
                                <EventSetter Event="MouseDoubleClick" Handler="TemplateParameterListBox_MouseDoubleClick"/>
                            </Style>
                        </HierarchicalDataTemplate.ItemContainerStyle>
                    </HierarchicalDataTemplate>
                    <DataTemplate DataType="{x:Type domain:TemplateParameter}">
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Name}" />
                            <TextBlock Text=" (" />
                            <TextBlock Text="{Binding ParameterID}" />
                            <TextBlock Text=" ; " />
                            <TextBlock Text="{Binding Sequence}" />
                            <TextBlock Text=")" />
                        </StackPanel>
                    </DataTemplate>
                </TreeView.Resources>
            </TreeView>
        </TabItem>

Вот ContextMenu:

<ContextMenu x:Key="NewEditDeleteContextMenu"
                 DataContext="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}">
        <MenuItem Header="New" 
                  Command="{Binding DataContext.NewFileCommand}"  
                  CommandParameter="{Binding}"/>
        <MenuItem Header="Edit" 
                  Command="{Binding DataContext.EditFileCommand}"  
                  CommandParameter="{Binding SelectedItem}"/>
        <MenuItem Header="Delete" 
                  Command="{Binding DataContext.DeleteFileCommand}"  
                  CommandParameter="{Binding SelectedItem}"/>
    </ContextMenu>

Таким образом, когда пользователь щелкает правой кнопкой мыши по дочернему узлу (TemplateParameter), все в порядке, но когда пользователь щелкает по родительскому узлу (TemplateFamily), приведение ниже в качестве TemplateParameter не работает, selectedTemplateParameter равно нулю, и приведение в операторе else тоже не работает.

В ViewModel у меня есть это:

public void NewFile(FrameworkElement frameworkElement)
    {

        System.Windows.Controls.TreeView treeView = frameworkElement as System.Windows.Controls.TreeView;              
        TemplateParameter selectedTemplateParameter = treeView.SelectedItem as TemplateParameter;

        if (selectedTemplateParameter != null)
        {
        ...
        }
        else
        {
            TemplateFamily templatefam = treeView.SelectedItem as TemplateFamily;
        }

    }

Так что мой вопрос , как я могу получить тип родителя при нажатии и выбрана опция New (Редактировать и удалять в настоящее время мало что значит)?На самом деле, даже если пользователь щелкает по дочернему элементу, мне просто нужно, чтобы родительское приведение в качестве TemplateFamily выполняло эту функцию.

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