1

Key.DeleteaDropDownが開いているときに、で強調表示されたアイテムを削除することは可能ですか?

例
(出典:iforce.co.nz

私が試したこと。

C#

    private void OnKeyUpHandler(object sender, KeyEventArgs e)
    {
        Boolean delete = e.Key == Key.Delete;
        if (sender == cbkSnpCodes && (delete && cbkSnpCodes.IsDropDownOpen))
        {
            cbkSnpCodes.Items.Remove(cbkSnpCodes.SelectedItem);
            cbkSnpCodes.Items.Refresh();
        }
    }

XAML

<ComboBox ItemsSource="{Binding SnpCodeModel}" Name="cbkSnpCodes" Controls:TextboxHelper.Watermark="Enter an snp code and press enter" MaxDropDownHeight="50" KeyUp="OnKeyUpHandler" KeyDown="OnKeyDownHandler" DisplayMemberPath="SnpCode" IsEditable="True" HorizontalAlignment="Left" VerticalAlignment="Top" Text="{Binding Path=SnpCode, Mode=TwoWay}" IsReadOnly="False" Height="26" Margin="81,9,0,0" Width="223" Grid.Column="1" Grid.ColumnSpan="2" />

バインディングクラスSnpCodeModel

class SnpCodeModel
{
    public string SnpCode { get; set; }

    public SnpCodeModel(string _snpcode)
    {
            this.SnpCode = _snpcode;
    }
}

また、 Harold BamfordがStackoverflowの質問に投稿した解決策を試しまし た。コンボボックスで、強調表示されたアイテム(選択されていないアイテム)を特定するにはどうすればよいですか?

    private void OnKeyUpHandler(object sender, KeyEventArgs e)
    {
        Boolean delete = e.Key == Key.Delete;
        ComboBox box = sender as ComboBox;
        if (box.IsDropDownOpen && delete)
        {
            const BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;
            PropertyInfo hl = box.GetType().GetProperty("HighlightedItem", flags);
            if (hl != null)
            {
                String hlString = hl.GetValue(sender, null).ToString();
                SnpCodeModel snp = new SnpCodeModel(hlString);
                cbkSnpCodes.Items.Remove(snp);
                cbkSnpCodes.Items.Refresh();
            }
        }
    }

しかし、それは機能しません:-(そしてこの出力をSystem.Diagnostics;

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=VerticalContentAlignment; DataItem=null; target element is 'ComboBoxItem' (Name=''); target property is 'VerticalContentAlignment' (type 'VerticalAlignment')

私の現在の試みの主な問題は、ComboBoxが編集可能であるため、削除しようとしているアイテムがにnull達する前になることcbkSnpCodes.Items.Removeです。

私が探している機能を実現することは可能ですか?私はグーグルで多くを見つけることができませんでした

4

1 に答える 1

1

を使用してSnpCodeModelの新しいインスタンスを作成していますSnpCodeModel snp = new SnpCodeModel(hlString);。同じ内容ですが、HighlightedItemと同じインスタンスではないため、cbkSnpCodesでは見つかりません。

次のようなものを試してください

        if (hl != null)
        {
            box.Items.Remove(hl.GetValue(sender, null));
            //box.Items.Refresh();
        }

または、SnpCodeModelのEqualsメソッドをオーバーライドします。

    public override bool Equals(object obj)
    {
        if (obj is SnpCodeModel)
            return ((SnpCodeModel)obj).SnpCode == this.SnpCode

        return false;
    }
于 2013-02-21T08:08:15.127 に答える