2013-07-25 11 views
6

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

XAML:

<ComboBox ItemsSource="{Binding ItemsCollection}" SelectedItem="{Binding SelectedItem}" /> 

देखें मॉडल:

public Collection<string> ItemsCollection; // Suppose this has 10 values. 
private string _selectedItem; 
public string SelectedItem 
{ 
    get { return _selectedItem; } 
    set 
    { 
     _selectedItem = value; 
     Trigger Notify of property changed. 
    } 
} 

अब इस कोड बिल्कुल ठीक काम कर रहा है। मैं दृश्य से चयन करने में सक्षम हूं और मैं ViewModel में परिवर्तन प्राप्त कर सकता हूं और यदि मैं अपने व्यूमोडेल से चयनित इटैम बदलता हूं तो मैं इसे अपने दृश्य में देख सकता हूं।

अब मैं यह हासिल करने की कोशिश कर रहा हूं। जब मैं अपने दृश्य से चयनित आइटम बदलता हूं तो मुझे एक चेक डालने की आवश्यकता होती है कि मूल्य अच्छा/खराब (या कुछ भी) चयनित आइटम सेट करें, अन्यथा इसे सेट न करें। तो मेरा विचार मॉडल इस तरह बदलता है।

public string SelectedItem 
{ 
    get { return _selectedItem; } 
    set 
    { 
     if (SomeCondition(value)) 
      _selectedItem = value;   // Update selected item. 
     else 
      _selectedItem = _selectedItem; // Do not update selected item. 
     Trigger Notify of property changed. 
    } 
} 

अब जब मैं निष्पादित इस कोड और SomeCondition (मान) झूठी देता है, SelectedItem रिटर्न वर्ष स्ट्रिंग मान, लेकिन ComboBox में मेरे विचार चयनित आइटम में मूल्य जो मैं चयन किया है। तो मान लीजिए कि मेरे कॉम्बोबॉक्स में दिखाए गए 10 तारों का संग्रह है। सभी मूल्य दूसरे और चौथे तत्व को छोड़कर अच्छे हैं (कुछ शर्त दूसरे और चौथे मान के लिए झूठी रिटर्न)। मैं क्या चाहता हूं कि अगर मैं चयनित 2 या 4 वें तत्व का चयन करता हूं तो यह नहीं बदलता है। लेकिन मेरा कोड यह ठीक से नहीं कर रहा है। यदि मैं दूसरा तत्व चुनता हूं तो फिर भी चयनित के रूप में दूसरा तत्व प्रदर्शित करता है। मुझे पता है कि मेरे कोड में कुछ गड़बड़ है। लेकिन यह क्या हैं?

+1

यह एक बहुत उपयोगकर्ता के अनुकूल डिजाइन नहीं है। अगर मैं एक combobox में कुछ चुनता हूं, तो मैं उम्मीद करता हूं कि यह मेरा चयनित आइटम हो। आपको इसके बजाय combobox से अमान्य विकल्प हटा देना चाहिए। यदि कोई चयन वैधता किसी अन्य UI तत्व के चयनित मान पर आधारित होती है, तो उस चयन को बदलने से combobox के ItemSource को पुनर्निर्माण करना चाहिए। –

+1

सभी वस्तुओं को दिखाने की आवश्यकता है, इसे बदल नहीं सकते हैं। –

+1

मैं सहमत नहीं हूं कि अमान्य विकल्प न दिखाएं, या उन्हें ग्रे आउट करें और उनमें से चयन अक्षम करें, यही यूआई है। –

उत्तर

14

को XAML बदलते यह एक बहुत ही दिलचस्प सवाल है की कोशिश करो। सबसे पहले मैं अन्य लोगों से सहमत हूं कि अवैध चयन को संभालने के लिए यह एक अनुशंसित दृष्टिकोण नहीं है। जैसा कि @blindmeis सुझाता है, IDataErrorInfo इसे हल करने का एक अच्छा तरीका है।

प्रश्न पर वापस जाएं। एक समाधान संतोषजनक क्या @Faisal हफीज चाहता है:

public string SelectedItem 
{ 
    get { return _selectedItem; } 
    set 
    { 
     var oldItem=_selectedItem; 
     _selectedItem=value; 
     OnPropertyChanged("SelectedItem") 

     if (!SomeCondition(value)) //If does not satisfy condition, set item back to old item 
      Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => SelectedItem = oldItem), 
               DispatcherPriority.ApplicationIdle); 
    } 
} 

Dispatcher एक और यूआई सिंक के दौरान कुछ यूआई तुल्यकालन को संभालने के लिए एक सुंदर तरीका है। उदाहरण के लिए, इस मामले में, आप चयन बाध्यकारी के दौरान चयन रीसेट करना चाहते हैं।

यहां एक प्रश्न यह है कि हमें पहले भी चयन को अपडेट करना होगा। ऐसा इसलिए है क्योंकि SelectedItem और SelectedValue अलग से असाइन किए गए हैं और ComboBox पर प्रदर्शित प्रदर्शन SelectedItem (शायद SelectedValue पर निर्भर नहीं है), मुझे यहां यकीन नहीं है)। और एक और दिलचस्प बिंदु यह है कि यदि चयनित वैल्यू बदलता है, SelectedItem बदलना चाहिए लेकिन SelectedItemSelectedValue को बदलते समय अपडेट नहीं करता है। इसलिए, आप SelectedValue से जुड़ना चुन सकते हैं ताकि आपको पहले असाइन करने की आवश्यकता न हो।

+0

यह काम करता है, इसके लिए धन्यवाद। –

+0

हमारे पास बिल्कुल वही समस्या थी और आपका कामकाज काम करता था। हम सभी वस्तुओं को भी दिखाना चाहते हैं हालांकि एक का चयन करना संभव नहीं है। और हम नियंत्रण को अक्षम नहीं करना चाहते हैं क्योंकि इसकी एक छोटी अवधि है कि किसी अन्य आइटम का चयन करना संभव नहीं है। क्या कोई ऐसा व्यवहार लिखने का कोई तरीका है जो सुनिश्चित करता है कि चयनकर्ता UI तत्व हमेशा सही संपत्ति मान दिखाता है? – Lumo

3

इस

<ComboBox ItemsSource="{Binding ItemsCollection}" SelectedItem="{Binding SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
+0

"मोड = टूवे" क्या आवश्यक है तो इसे काम करना चाहिए? मैंने अपने व्यू मॉडल कंस्ट्रक्टर में डिफ़ॉल्ट मान सेट करने का प्रयास किया, जो ठीक काम कर रहा था। लेकिन इसे सेटटर के अंदर सेट करना असफल रहा है। –

+0

@FaisalHafeez हां क्योंकि आप व्यू और व्यू मॉडेल में संपत्ति बदल रहे हैं साथ ही –