2013-02-21 72 views
1

我想知道是否可以使用Key.Delete刪除突出顯示的項目,而DropDown是打開的?從DropDown中刪除選定的項目(突出顯示)

example http://iforce.co.nz/i/eolrdqjq.mx3.png

我已經試過..

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對#1問題: In a combobox, how do I determine the highlighted item (not selected item)?

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

是否有可能實現我正在尋找的功能?我一直未能在google上找到太多

回答

1

您正在使用SnpCodeModel snp = new SnpCodeModel(hlString);創建一個SnpCodeModel的新實例。即使它具有相同的內容,它也不能在cbkSnpCodes中找到,因爲它與HighlightedItem不同。

嘗試像

 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; 
    } 
相關問題