2013-03-07 12 views
6

Mam z wieloma "klientami" używającymi MultiBinding jako Text (na przykład "644 Pizza Place") i działa to świetnie od początku (CustomerNumber). Ale w jaki sposób mogę go dopasować i wybrać po prostu wpisując "Pizza Place"?WPF ComboBox TextSearch using Zawiera zamiast StartsWith

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

Odpowiedz

4

ComboBox używa TextSearch class do wyszukiwania przedmiotów. Można ustawić TextSearch.TextPath właściwość zależność na ComboBox:

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

To pozwoli Ci dopasować przez CustomerName, ale będzie luźne dopasowanie przez CUSTOMERNUMBER.

Wyszukiwanie bez większych szczegółów odbywa się w następujący sposób: Metoda ComboBox.TextUpdated jest wywoływana podczas pisania. Ta metoda wywołuje TextSearch.FindMatchingPrefix, aby znaleźć odpowiedni element. TextSearch.FindMatchingPrefix to metoda, w której stosowane są wywołania string.StartsWith (..).

Nie ma sposobu na zastąpienie wywołań string.StartsWith() lub wywołań TextSearch.FindMatchingPrefix dla czegoś innego. Wygląda więc na to, że musisz napisać niestandardową klasę ComboBox, jeśli chcesz zamienić ciąg.StartsWith() z niestandardową logiką (jak string.Contains)

0

Tutaj mam alternatywne rozwiązania w MVVM.

mój plik XAML:

<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> 

mój plik CS:

//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(.....)}; 
    } 
} 

Możesz zobaczyć edytowalne combobox jest wiążąca do łańcucha (SearchText) Gdy nie jest wydarzeniem TextChanged spadek w dół jest wyświetlane, a powiązanie dwukierunkowe aktualizuje wartość. Źródło ItemsSource zostało zmienione w pliku cs, gdy przechodzi do zbioru {}; składnia.

A gist with the code above

+0

To lepiej. Jednak nie głosowałem. Twoja odpowiedź jest omawiana w Meta http://meta.stackoverflow.com/questions/327540/was-my-edit-removing-noise-and-a-link-wrong, więc zamierzasz zachęcić wiele osób do odwiedzenia . – JRSofty