我想在右键单击时删除我的列表框项目。但是,右键单击事件在我的情况下不起作用。 下面是我试过的代码。
在构造函数中:
listBox1.MouseDown += new MouseButtonEventHandler(listBox1_MouseRightClick);
右键点击:
private void listBox1_MouseRightClick(object sender, MouseButtonEventArgs e)
{
if (sender is ListBoxItem)
{
ListBoxItem item = (ListBoxItem)sender;
Harvest_TimeSheetEntry entryToDelete = (Harvest_TimeSheetEntry)item.DataContext;
MessageBoxResult Result = System.Windows.MessageBox.Show("Are you sure?", "Delete Confirmation", System.Windows.MessageBoxButton.YesNo);
if (Result == MessageBoxResult.Yes)
{
Globals._globalController.harvestManager.deleteHarvestEntry(entryToDelete);
}
else
{
System.Windows.MessageBox.Show("Delete operation Terminated");
}
}
}
在xaml:
<ListBox x:Name="listBox1" ItemsSource="{Binding}" Margin="0,131,0,59" ItemTemplateSelector="{StaticResource templateSelector}" SelectionMode="Single" MouseRightButtonDown="listBox1_MouseRightClick">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<EventSetter Event="MouseDown" Handler="listBox1_MouseRightClick"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
请建议,我应该如何使用右键单击事件以便它可以工作?
答案 0 :(得分:0)
删除右键单击的记录不是一个好设计,它会导致用户更加混淆功能。如果你想做某事,你可以去 PreviewMouseRightButtonDown 事件。请参阅以下代码段
ListBox1.PreviewMouseRightButtonDown += new MouseButtonEventHandler(ListBox1_MouseRightButtonDown);
按如下方式更改您的XAML
<ListBox x:Name="listBox1"
ItemsSource="{Binding}"
Margin="0,131,0,59"
ItemTemplateSelector="{StaticResource templateSelector}"
SelectionMode="Single">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<EventSetter Event="PreviewMouseRightButtonDown"
Handler="ListBox1_PreviewMouseRightButtonDown" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
答案 1 :(得分:0)
您的原始代码似乎多余且冗长。 MouseRightButtonDown
不起作用,因为已经有一个事件处理列表框项目选择,而ListBoxItem
datacontext只是listBox1的SelectedItem
。
摆脱覆盖样式,只需使用预览事件声明列表框即可。这将隧道MouseRightButtonDown
而不是冒泡它。
<ListBox x:Name="listBox1"
ItemsSource="{Binding}"
ItemTemplateSelector="{StaticResource templateSelector}"
Margin="0,131,0,59"
SelectionMode="Single"
PreviewMouseRightButtonDown="listBox1_MouseRightClick" />
在构造函数中,摆脱这个
listBox1.MouseDown += new MouseButtonEventHandler(listBox1_MouseRightClick);
现在在事件处理程序中,sender
是您的listbox1但如果您不将此事件与其他列表框绑定,只需从listbox1获取selectedItem并将其强制转换为相应的对象。否则,如果您决定要将多个列表框中的功能强制转换为sender
到ListBox
private void listBox1_MouseRightClick(object sender, MouseButtonEventArgs e)
{
Harvest_TimeSheetEntry entryToDelete = (Harvest_TimeSheetEntry)listBox1.SelectedItem;
if(entryToDelete != null)
{
//Do work
}
}