2011-02-10 3 views
10

PersonVM.csडब्ल्यूपीएफ: कॉम्बोबॉक्स के आइटम टेम्पलेट को बदलना आपके द्वारा टाइप किए जाने पर सूची को नीचे कूदने की क्षमता को हटा देता है। इसे ठीक करने का कोई उपाय?

public class MainWindowVM 
{ 
    public MainWindowVM() 
    { 
     PersonList = new ObservableCollection<Person>(Employees); 
    } 

    private Person[] Employees = new Person[] 
    { 
     new Person { ID = 1, Name = "Adam" }, 
     new Person { ID = 2, Name = "Bill" }, 
     new Person { ID = 10, Name = "Charlie" }, 
     new Person { ID = 15, Name = "Donna" }, 
     new Person { ID = 20, Name = "Edward" } 
    }; 

    public ObservableCollection<Person> PersonList { get; set; } 
} 

Person.cs

public class Person 
{ 
    public string Name { get; set; } 
    public int ID { get; set; } 
} 

MainWindow.xaml (कार्यात्मक काम कर संस्करण - नहीं हैं कि क्या मैं प्रदर्शित करना चाहते हैं)

<Window x:Class="TestApp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <ComboBox Height="23" Width="300" 
        ItemsSource="{Binding Path=Objects}" 
        DisplayMemberPath="Name" 
        > 
     </ComboBox> 
    </Grid> 
</Window> 

MainWindow.x एएमएल (दिखाता है सही ढंग से - ठीक ढंग से काम नहीं करता है)

<Window x:Class="TestApp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <ComboBox Height="23" Width="300" 
        ItemsSource="{Binding Path=Objects}" 
        > 
      <ComboBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock DataContext="{Binding}"> 
         <TextBlock.Text> 
          <MultiBinding StringFormat="{} {0} | {1}"> 
           <Binding Path="ID" /> 
           <Binding Path="Name" /> 
          </MultiBinding> 
         </TextBlock.Text> 
        </TextBlock> 
       </DataTemplate> 
      </ComboBox.ItemTemplate> 
     </ComboBox> 
    </Grid> 
</Window> 

दूसरा कोड प्रदर्शित करता है कि मैं क्या ComboBox {ID} | {Name} प्रदर्शित करना चाहते हैं, लेकिन यह ComboBox का एक आम समारोह दूर ले जाता है। पहले उदाहरण में, जब कॉम्बोबॉक्स का चयन किया जाता है तो उपयोगकर्ता इसमें टाइप करना शुरू कर सकता है और इसे सूची में नीचे चला सकता है। उदाहरण के लिए, यदि आप अक्षर ए दबाते हैं तो यह "एडम" पर कूदता है, बी "बिल" पर कूदता है, इस तरह कॉम्बोबॉक्स को काम करना चाहिए। लेकिन, जब मैं कॉम्बोबॉक्स आइटम टेम्पलेट को ओवरराइड करता हूं तो यह कार्यक्षमता खो देता है। क्या मुझे बांधने का एक और तरीका है जो मुझे चाहिए और उस कार्यक्षमता को बनाए रखें या इसे पुन: सक्षम करें? शायद आइटम टेम्पलेट गलत है?

+0

यह कर मैं आपके सवाल का सही ढंग से समझ रह गए हैं या आप कुछ और देख रहे थे? अगर मुझे कुछ स्पष्टीकरण देने की ज़रूरत है या मुझे यहां ट्रैक करने का तरीका है तो मुझे बताएं :) –

उत्तर

22

इस सवाल का मेरा उत्तर देखें: Can I do Text search with multibinding

दुर्भाग्य TextSearch.Text एक DataTemplate में काम नहीं करता। मुझे लगता है कि आपके पास दो विकल्प हैं

विकल्प 1। ComboBox के लिए सही पर IsTextSearchEnabled सेट, अपने स्रोत कक्षा में ToString ओवरराइड और एक बाध्यकारी

<ComboBox ... 
      IsTextSearchEnabled="True"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding}"/> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

public class Person 
{ 
    public override string ToString() 
    { 
     return String.Format("{0} | {1}", Name, ID); 
    } 

    public string Name { get; set; } 
    public int ID { get; set; } 
} 

विकल्प 2 को TextBlock में MultiBinding बदल जाते हैं। अपनी स्रोत कक्षा में एक नई संपत्ति बनाएं जहां आप TextSearch.TextPath के लिए नाम और आईडी जोड़ते हैं। इसके अलावा, आप NameAndId के लिए OnPropertyChanged बुलाना चाहिए जब भी आप के लिए Name या ID

<ComboBox ... 
      TextSearch.TextPath="NameAndId" 
      IsTextSearchEnabled="True"> 


public string NameAndId 
{ 
    return String.Format("{0} | {1}", Name, ID); 
} 
+0

+1 विकल्प 2 मेरे लिए काम करता है। धन्यवाद! – surfen

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