2010-08-17 13 views
8

मैं एक viewmodel जो INotifyPropertyChanged को लागू किया है। इस दृश्य पर मॉडल SubGroupingView नामक एक संपत्ति है। यह संपत्ति कॉम्बो बॉक्स के चयनित आइटम से जुड़ी है। जब मैं कॉम्बो बॉक्स बदलता हूं, तो स्रोत प्रॉपर्टी को ठीक से अपडेट किया जा रहा है, लेकिन जब मैं स्रोत प्रॉपर्टी बदलता हूं या जब नियंत्रण शुरू होता है, तो combobox.selectedItem संपत्ति में मौजूद चीज़ों को प्रतिबिंबित नहीं कर रहा है।
आपके प्रारंभ करने के लिए कुछ कोड है:Combobox SelectedItem अपडेट नहीं होता स्रोत बदल जाता

<ComboBox Grid.Column="3" Grid.Row="1" 
      Margin="0,1,4,1" 
      SelectedItem="{Binding Path=SubGroupingView, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, diag:PresentationTraceSources.TraceLevel=High}" 
      ItemsSource="{Binding Columns}" 
      DisplayMemberPath="DisplayName"> 

संपत्ति मुझे पता चलता है कि बाध्यकारी यह पता चला है और मूल्य का तबादला PropertyChanged घटना और TraceSource उत्पादन को जन्म देती है, इसकी सिर्फ इतना है कि बता गया यह दर्शाती नहीं है । किसी भी विचार का स्वागत किया जाएगा!

संपादित करें: ट्रेस स्रोत से
उत्पादन यह है:

System.Windows.Data Warning: 91 : BindingExpression (hash=23631369): Got PropertyChanged event from ReportViewModel (hash=52844413) 
System.Windows.Data Warning: 97 : BindingExpression (hash=23631369): GetValue at level 0 from ReportViewModel (hash=52844413) using RuntimePropertyInfo(SubGroupingView):   DataColumnViewModel (hash=58231222) 
System.Windows.Data Warning: 76 : BindingExpression (hash=23631369): TransferValue - got raw value DataColumnViewModel (hash=58231222) 
System.Windows.Data Warning: 80 : BindingExpression (hash=23631369): TransferValue - implicit converter produced DataColumnViewModel (hash=58231222) 
System.Windows.Data Warning: 85 : BindingExpression (hash=23631369): TransferValue - using final value DataColumnViewModel (hash=58231222) 

यहाँ स्रोत संपत्ति के लिए कोड है:

public class ReportViewModel : ViewModelBase, IReportTemplate 
{ 
    public DataColumnViewModel SubGroupingView 
    { 
     get 
     { 
      return GetViewModel(_report.SubGrouping); 
     } 
     set 
     { 
      if (_report.SubGrouping == value.ColumnName) 
       return; 
      _report.SubGrouping = value.ColumnName; 
      RefreshDataSeries(); 
      base.OnPropertyChanged("SubGroupingView"); 
      base.OnPropertyChanged("IsReady"); 
     } 

    } 
} 

नोट: ViewModelBase लागू करता INotifyPropertyChange

उत्तर
मैं ==,! = ऑपरेटरों अतिभारित, GetHashCode(), और Equals(object) और अब यह अच्छी तरह से काम कर रहा है। आपकी मदद के लिए धन्यवाद!

+0

ब्याज से, अपने एक्सएएमएल घोषणा में चयनित इटैम से पहले आइटमसोर्स सेट करने का प्रयास करें। –

+0

आर तुम मुझे मैट stalking? कोई भाग्य नहीं – TerrorAustralis

+0

दिलचस्प ... क्या आप संभवतः अपने व्यूमोडेल का एक स्निपेट पोस्ट कर सकते हैं (विशेष रूप से सब ग्रुपिंग व्यू की परिभाषा)? – Pwninstein

उत्तर

15

वस्तु अपने SubGroupingView से लौटे ComboBox.Items में वस्तुओं में से एक है (यह अपने कॉलम संग्रह में होना चाहिए जिसका अर्थ है) करने के लिए "बराबर" होना चाहिए। तो यदि आप "ए। एक्वाल्स (बी)" करते हैं, तो इसे सही वापस करने की आवश्यकता होगी।

वे कार्यात्मक रूप में एक ही कर रहे हैं, लेकिन नहीं सच लौटने जब तुलना में तो है कि आपकी समस्या है। आपको या तो एक ही ऑब्जेक्ट को वापस करने की आवश्यकता होगी, या बराबर विधि (और संभावित रूप से == और! = ऑपरेटरों) को ओवरराइड करना होगा।

इससे आपकी समस्या है, तो यह इस question में के रूप में ही समस्या है।

+0

बक्षीस के लायक है! अगर मैं कर सकता तो मैं आपको और भी वोट दूंगा !! एमवीवीएम के लिए इसका क्या प्रभाव है? क्या सभी एमवीवीएम वीएम बेस क्लास पर एक तुलनाकर्ता को लागू करना चाहिए? (एक और तीन घंटे के लिए बकाया पुरस्कार नहीं दे सकता) – TerrorAustralis

+0

निश्चित रूप से कहना मुश्किल है, क्योंकि हर स्थिति अलग है। अगर आप ViewMod हैं एल को आइटम्सकंट्रोल में उपयोग नहीं किया जाता है, तो इससे कोई फर्क नहीं पड़ता कि आप बराबर ओवरराइड करते हैं। लेकिन यदि आपने एक साधारण सूची किया है तो आप एक ही साइट पर चलेंगे। इसमें कुछ नहीं है। चूंकि इसमें समानता परीक्षण भी शामिल है। – CodeNaked

3

IsSynchronizedWithCurrentItem आपके ComboBox पर शायद false पर सेट है? आप IsSynchronizedWithCurrentItem="True" को स्पष्ट रूप से सेट करने का प्रयास कर सकते हैं और देख सकते हैं कि इससे मदद मिलती है या नहीं।

+0

धन्यवाद दोस्त, लेकिन कोई भाग्य नहीं, अगर मैं IsSynchronizedWithCurrentItem सेट करता हूं, तो यह स्रोत – TerrorAustralis

+1

पर सेटटर की आग नहीं करता है, इससे मुझे अपडेट करने में मदद मिली वस्तुओं की सूची और चयनित इंडेक्स वही रहे। – Dave

+0

यदि मैं इसे सेट करता हूं, तो मुझे "प्रॉपर्टी को असाइन करने में विफल" विंडोज़.यूआई.एक्सएमएल.कंट्रोल। प्राइमेटिव्स। चयनकर्ता। आईएस सिंक्रनाइज़ेड विथकुरेंट इटिम 'प्रारंभ होता है। (यह एक यूडब्ल्यूपी एप्लीकेशन है, संपत्ति इंटेलिसेंस द्वारा सुझाई गई थी, इसलिए यह मौजूद है) –

0

@CodeNaked का उत्तर सही है। लेकिन मेरे मामले में ऑब्जेक्ट ओवरराइडिंग। एक्वाल्स स्टैक ओवरफ्लो एक्सेप्शन फेंकता है। मुझे लगता है कि पूरा जवाब पूर्ण आईक्वेटेबल को कार्यान्वित करना है जिसका मतलब है कि इसके बराबर विधि को कार्यान्वित करना और ऑब्जेक्ट को ओवरराइड करना (ऑब्जेक्ट) और ऑब्जेक्ट। गेटहाशकोड विधियों को this example में देखें ("टिप्पणियां" अनुभाग का अंत देखें - "कार्यान्वयन के लिए नोट्स" - और " उदाहरण "खंड)।

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