2015-12-07 3 views
5

मैं WPF के साथ MVVM पद्धति का उपयोग कर रहा हूँ और एक समस्या है, जो मैं निम्नलिखित करने के लिए सरल बना सकते हैं में चलाने की है:आप कॉम्बोबॉक्स के चयनित इटैम को उस ऑब्जेक्ट से कैसे बांधते हैं जो आइटम्ससोर्स से किसी आइटम की एक प्रति है?

मैं एक CardType मॉडल है।

public class CardType 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

और मेरे पास एक व्यूमोडेल है जो कार्डटाइप का उपभोग करता है।

public class ViewModel : INotifyPropertyChanged 
{ 
    private CardType selectedCardType; 
    public CardType SelectedCardType 
    { 
     get { return selectedCardType; } 
     set 
     { 
      selectedCardType = value; 
      OnPropertyChanged(nameof(SelectedCardType)); 
     } 
    } 

    public IEnumerable<CardType> CardTypes { get; set; } 

    // ... and so on ... 
} 

मेरे XAML कोई ComboBox कि CardTypes पर अपने आइटम को आधार बनाता और SelectedCardType के आधार पर एक आइटम पहिले से चयन करना चाहिए है।

<ComboBox ItemsSource="{Binding CardTypes}" 
      DisplayMemberPath="Name" 
      SelectedItem="{Binding SelectedCardType}"/> 

मेरे नियंत्रण से बाहर कारणों के लिए, SelectedCardType वस्तु एक संदर्भ-असमान CardTypes में आइटम की प्रतिलिपि हो जाएगा। इसलिए WPF आइटम्ससोर्स में किसी आइटम को चयनित इटैम से मिलान करने में विफल रहता है, और जब मैं ऐप चलाता हूं, तो कॉम्बोबॉक्स प्रारंभ में कोई आइटम चयनित नहीं होता है।

मैंने कार्डटाइप पर समान() और GetHashCode() विधियों को ओवरराइड करने का प्रयास किया, लेकिन WPF अभी भी आइटम से मेल खाने में विफल रहता है।

मेरी अनोखी बाधाओं को देखते हुए, मैं सही आइटम का चयन करने के लिए कॉम्बोबॉक्स कैसे प्राप्त कर सकता हूं?

+0

शीर्ष जवाब काम करता मतदान करते हैं, इस: https: // stackoverflow .com/a/24776204/1121033 एक ही प्रश्न के लिए एक और अधिक सुरुचिपूर्ण समाधान है। –

उत्तर

0

एक वर्कअराउंड जो आप कर सकते हैं वह है कि आप अपने चुने हुए इटैम को एक स्ट्रिंग (कार्ड टाइप के बजाए) से बांधें, फिर इस स्ट्रिंग का उपयोग करके कार्ड टाइप टाइप करें।

3

आप SelectedValue और SelectedValuePath उपयोग कर सकते हैं:

<ComboBox ItemsSource="{Binding CardTypes}" 
      DisplayMemberPath="Name" 
      SelectedValue="{Binding ProductId, Mode=TwoWay}" 
      SelectedValuePath="Id"/> 

कहाँ productId NotifyPropertyChanged के साथ एक पूर्णांक संपत्ति है।

यहाँ एक महान स्पष्टीकरण पढ़ें: Difference between SelectedItem, SelectedValue and SelectedValuePath

+0

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

+0

ठीक है, इस विधि के साथ निश्चित रूप से आपके पास कम से कम एक पूर्णांक जोड़ने के लिए है। – Giangregorio

5

आप Equals और GetHashCode अधिभावी नहीं किया जा सकता ठीक से। यह आपके लिए काम करना चाहिए। (हालांकि, सिर्फ अधिभावी बराबर अपने मामले में काम करेंगे, लेकिन यह बहुत GetHashCode ओवरराइड करने के लिए अच्छा अभ्यास के रूप में जब आप ओवरराइड एक वर्ग के लिए बराबर माना जाता है)

public class CardType 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public override bool Equals(object obj) 
    { 
     CardType cardType = obj as CardType; 
     return cardType.Id == Id && cardType.Name == Name; 
    } 

    public override int GetHashCode() 
    { 
     return Id.GetHashCode() & Name.GetHashCode(); 
    } 
} 
+0

यह अनिवार्य रूप से मैंने पहले कोशिश की है। – Bryan

+0

मैंने जल्दी से इसे छोटे नमूने में आजमाया और मेरे लिए पूरी तरह से ठीक काम किया। क्या आप कोड जोड़ सकते हैं कि आप कोड से चयनित कार्ड टाइप कैसे सेट कर रहे हैं? –

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