2011-01-05 4 views
6

एक उदाहरण के रूप निम्नलिखित सरल पाठ बॉक्स का उपयोग करना:डब्ल्यूएसएफ कॉम्बोबॉक्स IEditable = "True" के साथ - मैं कैसे संकेत दे सकता हूं कि कोई मिलान नहीं मिला?

<ComboBox IsEditable="True" SelectedItem="{Binding}"> 
    <ComboBoxItem>Angus/ComboBoxItem> 
    <ComboBoxItem>Jane</ComboBoxItem> 
    <ComboBoxItem>Steve</ComboBoxItem> 
</ComboBox> 

मैं उपयोगकर्ता एक नाम लिखकर उनके चयन को खोजने के लिए अनुमति देने के लिए चाहते हैं, तो मैं IsEditable सच के बराबर निर्धारित किया है। संपत्ति के लिए स्वीकार्य मान चयनित इटैम सूची में से किसी एक विकल्प हैं, या कोई चयन नहीं है (शून्य)। समस्या यह है कि किसी व्यक्ति के नाम पर किसी प्रकार के नाम में डिफ़ॉल्ट रूप से कोई त्रुटि संकेत नहीं है जो सूची में नहीं है।

उदाहरण के लिए: एक उपयोगकर्ता, "बॉब" टाइप के कारण SelectedItem संपत्ति अशक्त हो सकती है, लेकिन पता ही नहीं है कि बॉब सूची में मौजूद नहीं है। इसके बजाय मैं के रूप में ComboBox के पाठ संपत्ति अशक्त या खाली और SelectedItem है अशक्त नहीं है जैसे ही एक दृश्य संकेत प्रदान करना चाहते हैं, और उन्हें किसी भी अधिक टाइपिंग से बंद कर देंगे?

मेरा प्रारंभिक विचार कस्टम सत्यापन नियम था, लेकिन मुझे नहीं पता कि combobox के टेक्स्ट और चयनित इटैम गुणों को कैसे एक्सेस किया जाए।

+0

पाठ्यक्रम के दौरान मेरे डब्ल्यूपीएफ शिक्षक ने कई बार बार-बार दोहराया: डब्ल्यूपीएफ में आपको कभी भी चयनित इटैम का स्पष्ट रूप से उपयोग नहीं करना चाहिए। संग्रह संग्रह के लिए यही है। –

उत्तर

3

स्टार्टर के रूप में, आप उपयोगकर्ता को यह देखने देना चाहेंगे कि वे उपलब्ध विकल्पों में से किसी एक में टाइप कर रहे हैं या नहीं।

1) "स्वत: पूर्ण combobox" ऑनलाइन खोजें।

2) इन की जाँच करें:

http://weblogs.asp.net/okloeten/archive/2007/11/12/5088649.aspx

http://www.codeproject.com/KB/WPF/WPFCustomComboBox.aspx

3) इसके अलावा इस प्रयास करें:

<ComboBox IsEditable="true" TextSearch.TextPath="Content"> 
     <ComboBoxItem Content="Hello"/> 
     <ComboBoxItem Content="World"/> 
    </ComboBox> 

ऊपर कोड स्निपेट प्रदान करने के लिए "है कि दृश्य एक Primite तरीका है संकेत "आप की तलाश में हैं। यदि उपयोगकर्ता 'एच' में टाइप करता है, तो इनपुट टेक्स्टबॉक्स में 'हैलो' दिखाई देगा। हालांकि, इस पर अपने पास एक अवैध चरित्र में टाइप करने से रोकने के लिए एक तंत्र नहीं होगा।

4) यह एक और अधिक उन्नत संस्करण है:

<ComboBox Name="myComboBox" IsEditable="true" KeyUp="myComboBox_KeyUp"> 
     <ComboBoxItem Content="Hello"/> 
     <ComboBoxItem Content="World"/> 
     <ComboBoxItem Content="WPF"/> 
     <ComboBoxItem Content="ComboBox"/> 
    </ComboBox> 

कोड-पीछे:

private void myComboBox_KeyUp(object sender, KeyEventArgs e) 
    { 
     // Get the textbox part of the combobox 
     TextBox textBox = myComboBox.Template.FindName("PART_EditableTextBox", myComboBox) as TextBox; 

     // holds the list of combobox items as strings 
     List<String> items = new List<String>(); 

     // indicates whether the new character added should be removed 
     bool shouldRemove = true; 

     for (int i = 0; i < myComboBox.Items.Count; i++) 
     { 
      items.Add(((ComboBoxItem)myComboBox.Items.GetItemAt(i)).Content.ToString()); 
     } 

     for (int i = 0; i < items.Count; i++) 
     { 
      // legal character input 
      if(textBox.Text != "" && items.ElementAt(i).StartsWith(textBox.Text)) 
      { 
       shouldRemove = false; 
       break; 
      } 
     } 

     // illegal character input 
     if (textBox.Text != "" && shouldRemove) 
     { 
      textBox.Text = textBox.Text.Remove(textBox.Text.Length - 1); 
      textBox.CaretIndex = textBox.Text.Length; 
     } 
    } 

यहाँ, हम उपयोगकर्ता न दें में लिखना जारी रखें एक बार हम कोई बता गया आइटम का पता लगाने टेक्स्टबॉक्स में पाठ के साथ शुरू होता है। हम जोड़े गए चरित्र को हटाते हैं और दूसरे चरित्र की प्रतीक्षा करते हैं।

+0

इस कोड में एक बग है - एक कुंजी को पकड़ना संभव है और लिखित रूप में कोड केवल अंतिम वर्ण को हटा देगा। (उदाहरण के लिए यदि उपयोगकर्ता 5 'एफ' दर्ज किए जाने तक 'f' कुंजी दबाता है, तो 4 को टेक्स्ट में जोड़ा जाएगा)। हालांकि मुझे अभी तक इसका समाधान नहीं मिला है। –

1

यह एक अच्छा समाधान है जब तक कि आपके पास कॉम्बो बॉक्स में बहुत से रिकॉर्ड न हों।

प्रचार फ़ाइल के शीर्ष पर इस

List<String> items = new List<String>(); 

private void myComboBox_KeyUp(object sender, KeyEventArgs e) 
{ 
    TextBox textBox = myComboBox.Template.FindName("PART_EditableTextBox", myComboBox) as TextBox; 

    // indicates whether the new character added should be removed 
    bool shouldRemove = true; 

    // this way you don't fill the list for every char typed 
    if(items.Count <= 0) 
    { 
     for (int i = 0; i < myComboBox.Items.Count; i++) 
     { 
      items.Add(((ComboBoxItem)myComboBox.Items.GetItemAt(i)).Content.ToString()); 
     } 
    } 
    // then look in the list 
    for (int i = 0; i < items.Count; i++) 
    { 
     // legal character input 
     if(textBox.Text != "" && items.ElementAt(i).StartsWith(textBox.Text)) 
     { 
      shouldRemove = false; 
      break; 
     } 
    } 

    // illegal character input 
    if (textBox.Text != "" && shouldRemove) 
    { 
     textBox.Text = textBox.Text.Remove(textBox.Text.Length - 1); 
     textBox.CaretIndex = textBox.Text.Length; 
    } 
} 

जब तक बाध्यकारी है कॉम्बो बॉक्स के लिए रिकॉर्ड जोड़ना जारी, मुझे लगता है कि एक अधिक कुशल देखने

2

यह वह जगह है: मैं इसे इस तरह से करना होगा समाधान उपयोगकर्ता परिवर्तनों के साथ उपयोगकर्ता 1234567 के उत्तर पर आधारित है। आइटम सूची को खोजने के बजाय यह कॉम्बोबॉक्स के चयनित इंडेक्स को एक मान> = 0 के लिए जांचता है कि यह देखने के लिए कि कोई मिलान मिला है और यह एक से अधिक वर्ण डालने के लिए आरबी की चिंता को हल करता है। जब यह पात्रों को अस्वीकार करता है तो यह एक श्रव्य प्रतिक्रिया भी जोड़ता है।

private int _lastMatchLength = 0; 

private void myComboBox_GotFocus(object sender, RoutedEventArgs e) 
{ 
    _lastMatchLength = 0; 
} 

private void myComboBox_KeyUp(object sender, KeyEventArgs e) 
{ 
    ComboBox cBox = sender as ComboBox; 

    TextBox tb = cBox.Template.FindName("PART_EditableTextBox", cBox) as TextBox; 
    if (tb != null) 
    { 
     if (cBox.SelectedIndex >= 0) 
     { 
      _lastMatchLength = tb.SelectionStart; 
     } 
     else if (tb.Text.Length == 0) 
     { 
      _lastMatchLength = 0; 
     } 
     else 
     { 
      System.Media.SystemSounds.Beep.Play(); 
      tb.Text = tb.Text.Substring(0, _lastMatchLength); 
      tb.CaretIndex = tb.Text.Length; 
     } 
    } 
} 
संबंधित मुद्दे