2011-09-22 18 views
6

मेरे डब्ल्यूपीएफ फॉर्म में 20 से अधिक चेकबॉक्स हैं। मुझे किसी ऑब्जेक्ट में उन सभी से IsChecked मानों की आवश्यकता है।चेकबॉक्स बाध्यकारी - बेहतर समाधान क्या है?

मुझे दो तरीकों से पता है।

1) इसी वस्तु में गुण here

2) की तरह निर्भरता संपत्ति का उपयोग कर के लिए सभी चेक बॉक्स बाँध उन्हें

कौन सा समाधान के लिए बेहतर है सभी का Clicked घटना संभाल? कोड-पीछे में कम जगह लेने का कोई बेहतर समाधान है?

उत्तर

3

निश्चित रूप से एक बाध्यकारी

का उपयोग अपने चेक बॉक्स से संबंधित नहीं हैं और जगह में सभी कर रहे हैं, तो आप अपने DataContext में या ViewModel

करने के लिए बाध्य करने के लिए अपने चेक बॉक्स सब एक साथ कर रहे हैं 20 विभिन्न निर्भरता गुण की आवश्यकता होगी , एक के बाद या एक ग्रिड में एक सूचीबद्ध जैसे, आप उन्हें एक संग्रह में डाल दिया और उन्हें

<ItemsControl ItemsSource="{Binding Options}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Content="{Binding Description}" 
         IsChecked="{Binding IsChecked}" /> 
     </DataTemplate> 
    </ItemsControl> 
</ItemsControl> 

आपका ViewModel या DataContext कुछ इस तरह होते हैं के लिए एक ItemsControl बाध्य कर सकते हैं:

private List<Option> options; 

private List<Option> Options 
{ 
    get 
    { 
     if (options== null) 
     { 
      options = new List<Option>(); 

      // Load Options - For example: 
      options.Add(new Option { Description = "Option A", IsChecked = false }); 
      options.Add(new Option { Description = "Option B" }); 
      options.Add(new Option { Description = "Option C", IsChecked = true}); 
     } 
     return options; 
    } 
} 

और अपने Option वर्ग बस

public class Option 
{ 
    public string Description { get; set; } 
    public bool IsChecked { get; set; } 
} 
+0

+1 रखा - हालांकि मैं IsSelected का उपयोग करना पसंद करता हूं; Ischecked का तात्पर्य है कि वस्तु हमेशा एक चेकबॉक्स (या इसी तरह) के लिए बाध्य होगी। –

1

IsChecked राज्य संग्रहीत करने के लिए मैं क्योंकि बाध्यकारी यूआई और कोड के पीछे अधिक स्वच्छ और decoupled रखने की अनुमति देता है पहले एक (using binding), यह बेहतर है का पालन करने का सुझाव देते हैं। दूसरा एक (handling an event) WinForms दृष्टिकोण की तरह है इसलिए मुझे नहीं लगता कि आपको WPF एप्लिकेशन में इसका पालन क्यों करना चाहिए।

संपादित करें: उत्तर कई गुणों के बारे में

सवाल करने के लिए, तो क्या वास्तव में एक दृश्य के लिए बाध्य है पर निर्भर करता है और कैसे की जाँच बक्से दृश्य में रखा जाता है। आप ListView जैसे कुछ ItemsControl कंटेनर और प्रत्येक चेक बॉक्स उपयोग कर रहे हैं एकल पंक्ति/स्तंभ के हैं - आप

private IList<bool> states; 
public IList<bool> States 
{ 
    get 
    { 
     return this.states; 
    } 

    set 
    { 
     this.states = value; 
     this.OnPropertyChanged("States"); 
    } 
} 

की तरह एक संग्रह करने के लिए सभी चेक बॉक्स बाँध आप एक ठोस जवाब देने के लिए कर सकते हैं - शेयर कृपया यूआई लेआउट फॉर्म का जहां चेकबॉक्स रखा गया है।

+0

Yay होगा,, यह बेहतर व्याख्या करने के लिए कृपया कोशिश मेरी अंग्रेजी काफी अच्छा नहीं है। कौन सा नंबर बेहतर है? –

+0

@Andrew: अद्यतन उत्तर देखें, मूल रूप से पहले एक - 1, दूसरा - 2 :)। मेरे बिंदु के दृष्टिकोण से मूल्यों को संग्रहीत करने के लिए बस बेहतर बाध्यकारी – sll

+0

वही प्रश्न जैसे मैंने डेविड बसराब उत्तर में पोस्ट किया ... –

2

बाध्यकारी।

कारण सरल है। यदि आपने Ischecked ईवेंट तक पहुंचने का निर्णय लिया है तो आपको यह पता लगाने के लिए अतिरिक्त कोड होना होगा कि कौन सी संपत्ति चेक बॉक्स है।

खराब मामला यह है कि आपके पास प्रत्येक के लिए एक विधि है।

बाध्यकारी के साथ एक बार जब आप चेकबॉक्स पर सेट कर लेंगे तो आप कर लेंगे। आपको बस ऑब्जेक्ट को अंत में सहेजना है।

+0

फिर भी, कोड-बैक में लगभग 20 निर्भरता गुण होंगे, है ना? प्रति चेकबॉक्स में एक संपत्ति। –

+0

@Andrew हां, यद्यपि यदि आपके चेकबॉक्स सभी एक ही क्षेत्र में हैं, तो आप उन वस्तुओं की सूची कर सकते हैं जिनमें 'विवरण' और' Ischecked' 'है, और उन्हें' आइटम नियंत्रण 'से बांधें। – Rachel

+0

लेकिन आपको निर्भरता गुणों से निपटने की ज़रूरत नहीं है। आपके पास एक ऐसा मामला हो सकता है जहां आप सभी 20 के लिए एक ही क्लिक ईवेंट का उपयोग करते हैं और उसके बाद ऑब्जेक्ट सरणी अपडेट करते हैं लेकिन फिर भी आपको यह निर्धारित करने के लिए तर्क की आवश्यकता होगी कि ईवेंट को कौन सा चेक बॉक्स कहा जाता है। लेकिन अगर आपके पास ऑब्जेक्ट सरणी है तो आप शायद ऑब्जेक्ट्स के लिए लिस्टबॉक्स जैसे कुछ इस्तेमाल कर रहे हों। – Paparazzi

2

यदि आप एक अच्छा एमवीवीएम ढांचा का उपयोग करते हैं तो आप बाध्यकारी का उपयोग हाथ से करने के बिना कर सकते हैं (केवल उन्हें कुछ सम्मेलन में नाम दें) - मुझे Caliburn Micro पसंद है लेकिन वहां बहुत सारे अच्छे लोग हैं।

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