Reputation: 4002
<DataTemplate DataType="{x:Type EntityType:FixedDevice}">
<TextBlock Text="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource NameConverter}}"/>
</DataTemplate>
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<EventSetter Event="PreviewMouseRightButtonUp" Handler="TreeViewItem_RightClick"/>
</Style>
</TreeView.ItemContainerStyle>
<TreeViewItem Header="Data Warehouse">
<TreeViewItem.Items>
<TreeViewItem Header="Platforms">
<TreeViewItem.Items>
<TreeViewItem>
<TreeViewItem.Header>
<TextBlock Text="{Binding RelativeSource={RelativeSource Self},
Path=Parent.Items.Count,
StringFormat=Public ({0})}">
</TextBlock>
</TreeViewItem.Header>
</TreeViewItem.Header>
</TreeViewItem.Items>
</TreeViewItem>
</TreeViewItem.Items>
</TreeViewItem>
private void TreeViewItem_RightClick(object sender, MouseButtonEventArgs e) {
TreeViewItem item = sender as TreeViewItem;
if(item != null) { item.Focus(); item.IsSelected = true; }
e.Handled = true;
}
How come when I right-click, it only selects the top-most node? and not the one I click? Similar for an ItemsSource
, which the Item
itself is not a TreeViewItem
, but a DataTemplate
with a TextBlock
, how do I select the object in the TreeView visually?
Edit, see below for answer based on @Viv answer.
I ended up having to use e.OriginalSource
to retrieve the TextBlock
then the TreeViewItem
that the Item
was in.
private void TreeViewItem_RightClick(object sender, MouseButtonEventArgs e) {
TreeViewItem item = (e.OriginalSource as FrameworkElement).Parent as TreeViewItem;
if(item == null) {
item = e.Source as TreeViewItem;
if(item == null) {
return;
}
}
item.IsSelected = true;
e.Handled = true;
}
Upvotes: 1
Views: 1910
Reputation: 17388
It's because what your looking for is e.Source
and not sender
try switching your right-click handler to:
private void TreeViewItem_RightClick(object sender, MouseButtonEventArgs e) {
TreeViewItem item = e.Source as TreeViewItem;
if (item == null)
return;
// item.Focus();
item.IsSelected = true;
e.Handled = true;
}
Upvotes: 1