У меня есть вид дерева на одной из трех вкладок.Две другие вкладки содержат списки.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 выполняло эту функцию.