2

文字列を表示するがありComboBoxます。リストからいくつかの項目を削除するオプションを追加するにはどうすればよいComboBoxですか? 私は試した:

<ComboBox.ContextMenu>
    <ContextMenu>
        <MenuItem Header="Remove" Click="MenuItem_OnClick"></MenuItem>
    </ContextMenu>
</ComboBox.ContextMenu>

しかし、ユーザーが選択したアイテムを見つける方法がわかりません:

private void MenuItem_OnClick(object sender, RoutedEventArgs e) {
    /* ... ??? ... */
}

各アイテムの横にアイコンを配置してもかまいません。クリックすると関連するアイテムが削除されますが、その方法がわかりません..

概要:

これが最終的に私がそれを解決した方法です(クレジットは、以下の受け入れられた回答で、を使用してNawed Nabi Zada「登山」の主なアイデアを提供したにVisualTreeHelper.GetParent(...)ComboBoxItem属します)

<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);
}

(システムの DLL からアイコンを取得する「アイコン エクストラクタ」は、私の古い投稿からのものです)

4

3 に答える 3

0

コンボボックスの項目を見つけるには、コンボボックスの項目テンプレートでチェックボックスを使用して、ユーザーが削除したい項目をチェックできるようにします。

コンボボックスがデータバインドされている場合、コンボボックスのデータソースをフィルタリングする必要があります。つまり、コンテキストメニューをクリックすると、ユーザーがチェックした項目をコンボボックスのデータソースから削除してから、コンボボックスをデータソースに再バインドする必要があります。

データバインドされたコンボボックスがない場合は、コンテキストメニューをクリックしてコンボボックスアイテムをループし、ユーザーがチェックしたアイテムを削除します。

于 2014-01-13T14:39:38.270 に答える