Certainly something I don't understand but I hope you could help me.
I have a wpf list view defined like this :
<ListView x:Name="listviewPlugins" ItemContainerStyle="{StaticResource ItemContainerStylePlugin}" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.RowSpan="2" BorderBrush="White"
AllowDrop="True" Drop="listviewPlugins_Drop" DragEnter="listviewPlugins_DragEnter"
PreviewMouseLeftButtonDown="listviewPlugins_PreviewMouseLeftButtonDown" ContextMenuOpening="listviewPlugins_ContextMenuOpening"
MouseMove="listviewPlugins_MouseMove"
KeyDown="listviewPlugins_KeyDown" >
<ListView.ContextMenu>
<ContextMenu Style="{StaticResource ContextMenus}" x:Name="PluginContextMenu" StaysOpen="False">
<MenuItem Style="{StaticResource MenuItemStyle}" x:Name="MenuConfigurePlugin" Header="{DynamicResource configurePlugin}" Click="MenuConfigurePlugin_Click" HorizontalAlignment="Left">
<MenuItem.Icon>
<materialDesign:PackIcon Foreground="Gray" Kind="Pencil" LayoutTransform="{StaticResource ContextMenuIconScaleTransform}"/>
</MenuItem.Icon>
</MenuItem>
<Separator Style="{StaticResource ContextMenuSeparator}"></Separator>
<MenuItem Style="{StaticResource MenuItemStyle}" x:Name="MenuDuplicatePlugin" Header="{DynamicResource duplicatePlugin}" Click="MenuDuplicatePlugin_Click" HorizontalAlignment="Left">
<MenuItem.Icon>
<materialDesign:PackIcon Foreground="Gray" Kind="ContentCopy" LayoutTransform="{StaticResource ContextMenuIconScaleTransform}"/>
</MenuItem.Icon>
</MenuItem>
<Separator Style="{StaticResource ContextMenuSeparator}"></Separator>
<MenuItem Style="{StaticResource MenuItemStyle}" x:Name="MenuRemovePlugin" Header="{DynamicResource deletePlugin}" Click="MenuRemovePlugin_Click" HorizontalAlignment="Left">
<MenuItem.Icon>
<materialDesign:PackIcon Foreground="Gray" Kind="ToyBrickRemoveOutline" LayoutTransform="{StaticResource ContextMenuIconScaleTransform}"/>
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</ListView.ContextMenu>
<ListView.View>
<GridView x:Name="listviewPluginsColumns" ColumnHeaderContainerStyle="{StaticResource GridViewHeaderStyle}">
<GridViewColumn Header="{DynamicResource PluginName}" Width="220" >
<GridViewColumn.CellTemplate>
<HierarchicalDataTemplate>
<StackPanel Height="21" Margin="0" Orientation="Horizontal" VerticalAlignment="Center">
<Image Source="{Binding Icon}" Width="20" Height="20"></Image>
<TextBlock Text="{Binding Name}" VerticalAlignment="Center"></TextBlock>
</StackPanel>
</HierarchicalDataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="{DynamicResource PluginDescription}" Width="250" >
<GridViewColumn.CellTemplate>
<HierarchicalDataTemplate>
<StackPanel Height="21" Margin="0" Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="{Binding UserDescription}" VerticalAlignment="Center"></TextBlock>
</StackPanel>
</HierarchicalDataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
If I right-click on one item thus the menu opens thus no problem.
But if I click on another item while the menu is open then the menu closes and opens again but the selected item is still the previously selected item. How can I make sure that the selected item is the one under the mouse?
I tried this code in PreviewMouseRightButtonDown but I can't get either ListViewItem or Item to select it:
var hit = VisualTreeHelper.GetParent(VisualTreeHelper.HitTest(listviewPlugins,Mouse.GetPosition(listviewPlugins)).VisualHit)
Thank you for your help.
Update :
private void MenuRemovePlugin_Click(object sender, RoutedEventArgs e)
{
RemoveSelectedPlugin();
return;
}
private void RemoveSelectedPlugin()
{
if (MessageBox.Show(cultureHelper.GetCultureString("deletePluginConfirmationContent"), cultureHelper.GetCultureString("deletePluginConfirmationTitle"), MessageBoxButton.YesNo, MessageBoxImage.Exclamation) == MessageBoxResult.Yes)
{
PluginInterface.Plugin source = (PluginInterface.Plugin)listviewPlugins.SelectedItem;
Configuration.Data.CfgJob job = (Configuration.Data.CfgJob)listviewJobs.SelectedItems[0];
job.RemovePlugin(source);
listviewPlugins.ItemsSource = null;
listviewPlugins.ItemsSource = job.Plugins;
}
}
You could move the
ContextMenufrom theListViewcontrol itself to theListViewItemcontainer:...and then easily get a reference to the parent
ListViewItemor itsDataContextin the event handler: