2010-02-04 16 views
5

में मल्टीबाइंडिंग का उपयोग कैसे करें यह मुझे NUTS चला रहा है !!!एक WPF कॉम्बोबॉक्स

मेरे पास ComboBox है जो कर्मचारी द्वारा एक क्वेरी फ़िल्टर करने के लिए उपयोग किया जाता है जो ठीक काम करता है लेकिन केवल कर्मचारियों को पहला नाम प्रदर्शित करता है। मैं कर्मचारियों पूरा नाम प्रदर्शित करने के लिए एक MultiValueConverter उपयोग करना चाहते हैं (यदि हम 2 Mikes और 2 Daves नहीं था यह कम आवश्यक होगा)

नीचे (मेरे कार्य कोड और IMultiValueConverter क्लास है अनावश्यक स्वरूपण संक्षिप्तता के लिए बाहर छंटनी के साथ)। मैंने मल्टीकॉन्टर को काम करने के बारे में सोचने की हर चीज की कोशिश की है लेकिन मुझे कोई भाग्य नहीं मिला है।

// This collection is used to populate the Employee Filter ComboBox 
private ObservableCollection<Employee> employeesFilter; 
public ObservableCollection<Employee> EmployeesFilter 
{ 
    get { 
      return employeesFilter; 
     } 
    set { 
     if (employeesFilter != value) 
     { 
      employeesFilter = value; 
      OnPropertyChanged("EmployeesFilter"); 
     } 
    } 
} 

// This property is TwoWay bound to the EmployeeFilters SelectedValue 
private Employee employeeToShow; 
public Employee EmployeeToShow 
{ 
    get { 
      return employeeToShow; 
     } 
    set { 
     if (employeeToShow != value) 
     { 
      employeeToShow = value; 
      OnPropertyChanged("EmployeeToShow"); 
      QueryIssues(); // Requery with new employee filter 
     } 
    } 
} 

IMultiValueConverter:

<ComboBox ItemsSource="{Binding Path=EmployeesFilter}" 
         DisplayMemberPath="EmpFirstName" 
         SelectedValue="{Binding Path=EmployeeToShow, Mode=TwoWay}"/> 

ViewModel गुण यह स्वाभाविक है

class StringsToFullNameMultiConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, 
          Type targetType, 
          object parameter, 
          System.Globalization.CultureInfo culture) 
    { 
     // I added this because I kept getting DependecyProperty.UnsetValue 
     // Passed in as the program initializes 
     if (values[0] as string != null) 
     { 
      string firstName = (string)values[0]; 
      string lastName = (string)values[1]; 
      string fullName = firstName + " " + lastName; 
      return fullName; 
     } 
     return null; 
    } 

    public object[] ConvertBack(object value, 
           Type[] targetTypes, 
           object parameter, 
           System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
} 

मैं अलग अलग बातें की एक बहुत कुछ करने की कोशिश की लेकिन मूल रूप से ComboBox में निम्नलिखित का उपयोग कर रहा

<ComboBox.SelectedValue> 
    <MultiBinding Converter="{StaticResource StringsToFullNameMultiConverter}" 
        Mode="OneWay" > 
      <Binding Path="EmpFirstName" /> 
      <Binding Path="EmpLastName"/> 
    </MultiBinding> 
</ComboBox.SelectedValue> 

जैसा कि यह अब खड़ा है कनवर्टर को तब कहा जाता है जब प्रोग्राम DependencyProperty.UnsetValue पर सेट मानों के साथ शुरू होता है। इसके बाद जब आप बॉक्स से कोई नाम चुनते हैं तब भी इसे कभी भी नहीं कहा जाता है। नाम अभी भी पहले नाम के रूप में प्रदर्शित होते हैं।

आपके द्वारा प्रदान किए जा सकने वाले अच्छे ट्यूटोरियल/नमूने के लिए किसी भी मदद या पॉइंटर्स के लिए धन्यवाद। वेब पर जो भी मैं खोजता हूं वह टेक्स्टबॉक्स के लिए होता है और मैं उन्हें पूरे दिन ठीक कर सकता हूं।

उत्तर

19

आप करीब हैं! आप क्या करना चाहते हैं हालांकि ComboBox.ItemTemplate है, SelectedValue नहीं। कुछ एक्सएएमएल नरक के लिए तैयार करें।

<ComboBox.ItemTemplate> 
    <DataTemplate> 
     <TextBlock> 
      <TextBlock.Text> 
       <MultiBinding Converter="{StaticResource StringsToFillNameMultiConverter}"> 
        <Binding Path="EmpFirstName" /> 
        <Binding Path="EmpLastName" /> 
       </MultiBinding> 
      </TextBlock.Text> 
     </TextBlock> 
    </DataTemplate> 
</ComboBox.ItemTemplate> 

इसके अलावा, अगर मैं सही ढंग से याद करते हैं, तो आप अगर आप सिर्फ तार स्वरूपण रहे हैं अपनी खुद की कनवर्टर बनाने की जरूरत नहीं है। मुझे लगता है कि आप कर सकते हैं निम्नलिखित (किसी कृपया मुझे ठीक कर लें मैं गलत हूँ।)

<!-- "Last, First" --> 
<MultiBinding StringFormat="{}{1}, {0}"> 
    <Binding Path="EmpFirstName" /> 
    <Binding Path="EmpLastName" /> 
</MultiBinding> 
+0

विचित्र रूप से यह काम करता है लेकिन xaml को एक त्रुटि के साथ हाइलाइट किया जाता है, त्रुटि "संपत्ति 'टेक्स्ट' प्रकार 'मानों को' मल्टीबाइंडिंग 'प्रकार के मानों का समर्थन नहीं करती है। मुझे यकीन है कि यह एक आसान फिक्स होगा लेकिन मैं इसे तब तक छोड़ रहा हूं जब से मेरा असली मुद्दा हल हो गया है! मदद के लिए बहुत बहुत धन्यवाद, मुझे जागृत रखने के लिए मुझे एक अनसुलझा रहस्य के साथ बिस्तर पर जाने से नफरत है –

+0

वैसे, आपके पास कनवर्टर के बिना फ़ॉर्मेटिंग के लिए कोड पूरी तरह से काम करता है! –

+0

यह एक अजीब त्रुटि है। लगता है जैसे यह एक हानिरहित साइडर बग हो सकता है हालांकि। – Josh

0

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

टाइप कन्वर्ट ठीक है बशर्ते आपको विभिन्न फ़ील्ड के स्वरूपण को नियंत्रित करने की आवश्यकता न हो।

0

मैं अपने क्लास के लिए एक केवल पढ़ने के लिए संपत्ति addig और Combobox

public class MyEmployee 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string DisplayName { 
    get { return FirstName + " " + LastName; } 
     } 
} 

में Displaymemberpath इस्तेमाल कर सकते हैं अपनी स्थिति के लिए यह काम की तरह कुछ ... द्वारा समाप्त हो गया? बीआर, डैनियल

+0

ईमानदारी से मुझे कोई जानकारी नहीं है, मूल प्रश्न 2010 से है और मेरे रडार से बहुत लंबा है :) –

+0

मैंने इसे देखा ... बस इसका मतलब है कि अगर कोई इसका इस्तेमाल कर सकता है तो मेरे 2 सेंट पोस्ट करना :) – dba

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