2013-03-07 9 views
6

Ich habe eine ComboBox mit einer Menge von "Kunden" mit MultiBinding als Text (zum Beispiel "644 Pizza Place") und dies funktioniert super Suche von Anfang (CustomerNumber). Aber wie stelle ich es zusammen und wähle es aus, indem ich einfach "Pizza Place" eingebe?WPF ComboBox TextSearch mit Enthält anstelle von StartsWith

<MultiBinding StringFormat="{}{0} {1}"> 
    <Binding Path="CustomerNumber" /> 
    <Binding Path="CustomerName" /> 
</MultiBinding> 

Antwort

4

Die ComboBox verwendet TextSearch class für die Suche nach Artikeln. Sie können TextSearch.TextPath Abhängigkeitseigenschaft auf der ComboBox gesetzt:

<ComboBox Name="cbCustomers" TextSearch.TextPath="CustomerName">...</ComboBox> 

Dies ermöglicht es Ihnen von Kundenname übereinstimmen, aber Sie werden durch passende Kundennummer verlieren.

Das Nachschlagen, ohne viel Details, erfolgt auf folgende Weise: ComboBox.TextUpdated Methode wird während der Eingabe aufgerufen. Diese Methode ruft TextSearch.FindMatchingPrefix auf, um das übereinstimmende Element zu finden. TextSearch.FindMatchingPrefix ist die Methode, bei der Aufrufe von string.StartsWith (..) verwendet werden.

Es gibt keine Möglichkeit, string.StartsWith() - Aufrufe oder TextSearch.FindMatchingPrefix-Aufrufe für etwas anderes zu ersetzen. Es sieht also so aus, als müssten Sie Ihre benutzerdefinierte ComboBox-Klasse schreiben, wenn Sie string.StartsWith() mit Ihrer benutzerdefinierten Logik (wie string.Contains) austauschen möchten.

0

Hier habe ich eine Alternative im MVVM-Framework.

meine XAML-Datei:

<ComboBox Name="cmbContains" IsEditable="True" IsTextSearchEnabled="false" ItemsSource="{Binding pData}" DisplayMemberPath="wTitle" Text="{Binding SearchText ,Mode=TwoWay}" > 
    <ComboBox.Triggers> 
     <EventTrigger RoutedEvent="TextBoxBase.TextChanged"> 
      <BeginStoryboard> 
       <Storyboard> 
        <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsDropDownOpen"> 
         <DiscreteBooleanKeyFrame Value="True" KeyTime="0:0:0"/> 
        </BooleanAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </ComboBox.Triggers> 
</ComboBox> 

meine cs-Datei:

//ItemsSource - pData 
//There is a string attribute - wTitle included in the fooClass (DisplayMemberPath) 
private ObservableCollection<fooClass> __pData; 
public ObservableCollection<fooClass> pData { 
    get { return __pData; } 
    set { Set(() => pData, ref __pData, value); 
     RaisePropertyChanged("pData"); 
    } 
} 

private string _SearchText; 
public string SearchText { 
    get { return this._SearchText; } 
    set { 
     this._SearchText = value; 
     RaisePropertyChanged("SearchText"); 

     //Update your ItemsSource here with Linq 
     pData = new ObservableCollection<fooClass>{pData.ToList().Where(.....)}; 
    } 
} 

Sie die editierbare comboBox auf den String verbindlich sehen (Suchtext) Sobald es ein Textchanged-Ereignis nach unten der Tropfen ist wird angezeigt und die Zweiwegbindung aktualisiert den Wert. Die ItemsSource wurde in der CS-Datei geändert, während sie in den Satz {}; Syntax.

A gist with the code above

+0

Das ist besser. Ich habe dich aber nicht abgelehnt. Ihre Antwort wird in Meta http://meta.stackoverflow.com/questions/327540/was-my-edit-removing-noise-and-a-link-wrong gesprochen, so dass Sie eine Menge Leute besuchen werden . – JRSofty