【发布时间】:2014-01-13 14:20:12
【问题描述】:
我有一个显示字符串的ComboBox。如何添加从ComboBox 列表中删除某些项目的选项?我试过了:
<ComboBox.ContextMenu>
<ContextMenu>
<MenuItem Header="Remove" Click="MenuItem_OnClick"></MenuItem>
</ContextMenu>
</ComboBox.ContextMenu>
但我不知道如何找到用户选择的项目:
private void MenuItem_OnClick(object sender, RoutedEventArgs e) {
/* ... ??? ... */
}
我不介意在每个项目旁边放一些图标,单击时会删除其相关项目,但不知道该怎么做..
总结:
<ComboBox IsEditable="True" Name="RemotePathComboBox" VerticalAlignment="Center"
SelectionChanged="RemotePathComboBoxOnSelectionChanged"
Grid.Column="1" Margin="0,6" KeyUp="HostNameOrIPAddress_OnKeyUp">
<ComboBox.ItemTemplate>
<DataTemplate>
<DockPanel>
<Button Click="RemoveRemotePathItem_Click" Margin="5" DockPanel.Dock="Left">
<Image Source="{Binding Converter={StaticResource iconExtractor}, ConverterParameter=%WinDir%\\System32\\shell32.dll|131}"/>
</Button>
<TextBlock Name="ItemTextBlock" VerticalAlignment="Center" Text="{Binding Path=Path}"></TextBlock>
</DockPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
代码隐藏:
private void RemoveRemotePathItem_Click(object sender, RoutedEventArgs e) {
var depObj = sender as DependencyObject;
while (!(depObj is ComboBoxItem)) {
if (depObj == null) return;
depObj = VisualTreeHelper.GetParent(depObj);
}
var comboBoxItem = depObj as ComboBoxItem;
var item = comboBoxItem.Content as RemotePathItem;
_remotePathsList.Remove(item);
RemotePathComboBox_SelectIndexWithoutChangingList(0);
}
(The "Icon Extractor" that fetches the icon from the system's DLL is from an old post of mine)
【问题讨论】:
-
虽然它偏离了您当前的策略,但您可以考虑只处理
DEL键。 -
@MichaelPerrenoud,它不会很人性化。
-
使用SelectedItem? ComboBox 上的 ContextMenu 对我来说似乎是错误的......
-
@StefanDenchev,是的,我可以先选择该项目,然后做一些事情(右键单击/单击一些“删除”按钮/等...),但我正在寻找直观的用户的方式 - 这样他就可以一个一个地删除他想要的项目,而不必选择删除 - 选择删除 - 选择删除 - ...
-
你的意思是右键单击不会选择项目(就像我说的,我永远不会在组合上放置上下文菜单)?
标签: c# wpf xaml visualtreehelper