2013-03-07 6 views
6

के बजाय शामिल मैं "ग्राहकों" MultiBindingText के रूप में (उदाहरण के "644 पिज्जा प्लेस" के लिए) का उपयोग कर के बहुत कुछ के साथ एक ComboBox मिला है और इस शुरुआत (CUSTOMERNUMBER) से महान खोज काम करता है। लेकिन मैं इसे "पिज्जा प्लेस" दर्ज करके इसे कैसे मेल और चुन सकता हूं?WPF ComboBox TextSearch का उपयोग कर StartsWith

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

उत्तर

4

कॉम्बोबॉक्स आइटम लुकअप के लिए TextSearch class का उपयोग करता है। आप ComboBox पर TextSearch.TextPath निर्भरता गुण सेट कर सकते हैं:

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

यह आपको CUSTOMERNAME से मिलान करने के लिए अनुमति देगा, लेकिन आप CUSTOMERNUMBER से मिलान खो देंगे।

लुकअप, अधिक जानकारी के बिना, निम्न तरीके से किया जाता है: कॉम्बोबॉक्स। टेक्स्ट अपडेटेड विधि आपके द्वारा टाइप की जाती है। मेलिंग आइटम खोजने के लिए यह विधि TextSearch.FindMatchingPrefix को आमंत्रित करती है। TextSearch.FindMatchingPrefix वह तरीका है जहां string.StartsWith (..) कॉल का उपयोग किया जाता है।

स्ट्रिंग .tartsWith() कॉल या टेक्स्टशर्च को बदलने का कोई तरीका नहीं है। ढूँढें मैकिंग Prefix कुछ और के लिए कॉल करता है। तो ऐसा लगता है कि अगर आप अपने कस्टम लॉजिक (जैसे स्ट्रिंग। कॉन्टैन्स) के साथ स्ट्रिंग। स्टार्ट्स विथ() को अपने कस्टम कॉम्बोबॉक्स क्लास को लिखना चाहते हैं, तो

0

यहां मेरे पास एमवीवीएम फ्रेमवर्क में एक विकल्प है।

मेरी 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> 

मेरी सीएस फ़ाइल:

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

आप देख सकते हैं संपादन योग्य बता गया स्ट्रिंग (SearchText) के लिए बाध्य हो जाने के बाद वहाँ एक TextChanged घटना ड्रॉप डाउन है दिखाया गया है और दो तरह बाध्यकारी मूल्य अद्यतन करें। सीएस फ़ाइल में आइटम्ससोर्स बदल गया, जबकि यह सेट {}; वाक्य - विन्यास।

A gist with the code above

+0

यह बेहतर है। हालांकि मैंने आपको वोट नहीं दिया था। मेटा http://meta.stackoverflow.com/questions/327540/was-my-edit-removing-noise-and-a-link-wrong में आपके उत्तर के बारे में बात की जा रही है ताकि आप बहुत से लोगों को मिलने जा रहे हैं । – JRSofty

संबंधित मुद्दे