2016-07-11 10 views
0

Ich habe eine nicht editierbare Combobox (SupplierDropdown), und ich möchte, wenn der Benutzer den letzten Wert auf der Liste wählt, sollte die Combobox editierbar sein, ohne Wert und automatisch fokussiert für die Benutzer, um ihren Wert einzugeben. Mit anderen Worten, eine editierbare, leere Box mit einem blinkenden Cursor zur Eingabe bereit.Combobox bekommt keinen Fokus

Hier ist der Code, den ich habe:

private void SupplierDropdown_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (SupplierDropdown.SelectedIndex == SupplierDropdown.Items.Count - 1) 
     { 
      SupplierDropdown.IsEditable = true; 
      SupplierDropdown.Text = ""; 
      SupplierDropdown.Focus(); 
     } 
    } 

Doch obwohl in der Tat die Combobox editierbar wird, wird der Rest des Codes nicht zu funktionieren scheint: (a) die Combobox klar nicht den Wert der Benutzer hat gewählt, und (b) die Combobox bekommt den Fokus nicht, der Benutzer muss einmal auf den Tab drücken, um den blinkenden Cursor in der Combobox zu sehen.

Wie kann ich das schaffen?

+1

Ich würde nicht empfehlen, mit dem Index zu arbeiten, aber vergleichen Sie das 'SelectedItem' mit Ihrer" Other "/" Custom "-Instanz, die robuster sein sollte. –

+0

Außerdem fehlt die else-Klausel, die die Bearbeitbarkeit zurücksetzt. –

+0

@H.B. Danke, ich möchte Sie bitten, mehr zu Ihrem ersten Kommentar zu erzählen, aber ich glaube nicht, dass hier der richtige Ort dafür ist. Was deinen zweiten Kommentar angeht, hast du recht, das ist noch kein fertiger Code, ich bin einfach hier geblieben und habe mich entschieden zu fragen. –

Antwort

1

Das scheint ein großer Schmerz zu sein, weil die Kontrolle einfach nicht so verwendet werden soll. Selbst wenn Sie die anfängliche Logik zum Funktionieren bringen, ist es schwierig, das bearbeitbare Flag auf eine vernünftige Weise wieder auszuschalten. Wenn der Benutzer Text eingibt, der teilweise mit einer gegebenen Option übereinstimmt, wird er diese Option auswählen. Woher weißt du, ob diese Auswahl versehentlich oder absichtlich verursacht wurde und ob das editierbare Flag wieder auf false gesetzt werden sollte?

Ich würde das zusätzliche Schema TextBox empfehlen, wo Sie nur eine TextBox für benutzerdefinierte Werte anzeigen, kann nur in XAML (wenn Sie wissen, welcher Wert auf ausgelöst werden), aber das ist nicht notwendig.

<ComboBox Name="cb" SelectedValuePath="Content"> 
    <ComboBoxItem>A</ComboBoxItem> 
    <ComboBoxItem>B</ComboBoxItem> 
    <ComboBoxItem>Other</ComboBoxItem> 
</ComboBox> 
<TextBox> 
    <TextBox.Style> 
     <Style TargetType="TextBox"> 
      <Setter Property="Visibility" Value="Collapsed"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding SelectedValue, ElementName=cb}" Value="Other"> 
        <Setter Property="Visibility" Value="Visible"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBox.Style> 
</TextBox> 

(PS: Dies ist ein Beispiel der Verwendung des Gegenstands/Wertes anstelle des Index, auch wenn jemand entscheidet, dass die „andere“ Option an der Spitze statt sein sollte, wird der Code weiterhin wie vorgesehen, Ihr würde es nicht tun.)

+0

Danke! Ich nahm Ihre Methode, die Textbox-Route zu gehen, obwohl Sie Code-behind tun. –