2011-08-24 14 views
6

मैंने अपने छोटे दिल की खोज की है और इसकी पूरी तरह से संभव है कि मुझे कुछ महत्वपूर्ण और स्पष्ट याद आ रही है।डब्ल्यूपीएफ अद्यतन एक सरणी में तत्व के लिए बाध्यकारी

<CheckBox IsChecked="{Binding Permissions[0]}" /> 
<CheckBox IsChecked="{Binding Permissions[1]}" /> 
... 
<CheckBox IsChecked="{Binding Permissions[5]}" /> 

वे सही ढंग से उस प्रॉपर्टी के उनके मूल्यों मिलता है, लेकिन चेक बॉक्स बदल रहा है प्रतीत नहीं होता:

मैं एक BitArray और चेक बॉक्स कि इतने तरह, सरणी में तत्वों के लिए बाध्य कर रहे हैं की एक श्रृंखला है उस संपत्ति के सेटटर को ट्रिगर करें।

मैंने स्ट्रिंग सरणी के तत्व से बंधे एक टेक्स्टबॉक्स के साथ वास्तव में एक सरल उदाहरण की कोशिश की।

class TestArray 
{ 
    private string[] _nameArray = new string[3]; 

    public TestArray() 
    { 
     _nameArray[1] = "test name"; 
    } 

    public string[] NameArray 
    { 
     get { return _nameArray; } 
     set { _nameArray = value; } 
    } 
} 

यहाँ यूआई तत्व है:

<TextBox Text="{Binding NameArray[1], UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" /> 

फिर, इस टेक्स्ट बॉक्स बाध्यकारी ठीक से नाम हो जाता है, लेकिन सेटर हिट नहीं करता है, तो मैं इसे बदल जाते हैं।

यह पूरी तरह से एक हड्डी का सवाल हो सकता है और समझने की गंभीर कमी से हो सकता है इसलिए आपके धैर्य के लिए धन्यवाद!

उत्तर

0

जो चीज गायब है वह अधिसूचना है कि मान बदल गया है। जब आप मानक .NET गुणों (तथाकथित सीएलआर गुण) से जुड़ते हैं, तो आपको मूल्य परिवर्तन के नियंत्रण को सूचित करने के लिए एक अतिरिक्त ईवेंट ट्रिगर करने की आवश्यकता होती है। इस SO Question पर एक नज़र डालें। इसके अलावा MSDN सहायक हो सकता है।

मैं कुछ WPF बुनियादी अवधारणाओं को पहले पढ़ने की भी सिफारिश कर सकता हूं। WPF in Action (slightly outdated) या WPF Unleashed जैसी पुस्तकें मदद कर सकती हैं।

2

मैंने पहले कभी इस दृष्टिकोण की कोशिश नहीं की है, लेकिन मुझे नहीं लगता कि यह काम करेगा। क्योंकि जिस संपत्ति को आप सेटर आग देखने की प्रतीक्षा कर रहे हैं वह संपत्ति बंधी नहीं है। NameArray NameArray [i] जैसा नहीं है।

मैं कई चेकबॉक्स प्राप्त करने के लिए पर्यवेक्षण चयन और टेम्पलेटिंग को देखने का सुझाव दूंगा। उदाहरण के लिए आप चेकबॉक्स का एक क्षैतिज सूची बॉक्स बना सकते हैं जो एक ऑब्जर्जेबल कोलेक्शन से जुड़ता है।

2

फिर, इस टेक्स्टबॉक्स को बाध्यकारी से नाम ठीक है, लेकिन अगर मैं इसे बदलता हूं तो सेटटर को हिट नहीं करता है।

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

यह BitArray के साथ भी ठीक काम करता है (मैंने अभी एक सरणी और BitArray दोनों के साथ प्रयास किया है)।

हालांकि, सरणी (और बिटअरे)या INotifyCollectionChanged लागू नहीं करते हैं, इसलिए यदि सरणी में मानों के लिए अन्य बाइंडिंग हैं, तो उन्हें स्वचालित रूप से रीफ्रेश नहीं किया जाएगा। आप एक आवरण है कि इन इंटरफेस को लागू करता है (उदाहरण के लिए ObservableCollection<T>)

2

आप सेटर में न करना पड़े आवश्यकता होगी क्योंकि आप NameArray के लिए मूल्य में परिवर्तन नहीं करते हैं, तो आप सरणी में एक विशिष्ट सूचकांक का मान बदलने के उदाहरण के लिए नामअरे [1]। तो बाध्यकारी काम करता है लेकिन आप सेटटर में खत्म नहीं होंगे।

एक बेहतर दृष्टिकोण एक ObservableCollection का उपयोग करें और आप तत्व सूचकांक बंधन का उपयोग करने वाले सरणी तत्वों सेट करने के लिए सक्षम नहीं होगा एक ItemsControl

+1

मुझे लगता है कि कार्रवाई के अपने अगले पाठ्यक्रम है - कि एक बहुत बेहतर काम करना चाहिए। धन्यवाद! – statikuz

1

करने के लिए इसे बाध्य करने के लिए है।

class TestArray : INotifyPropertyChanged 
{ 
    private string[] _nameArray = new string[3]; 

    public TestArray() 
    { 
     _nameArray[1] = "test name"; 
    } 

    public string Name 
    { 
     get { return _nameArray[0]; } 
     set { 
       _nameArray[0] = value; 
       NotifyPropertyChanged("Name"); 
      } 
    } 
} 

आप (के रूप में MSDN प्रति http://msdn.microsoft.com/en-us/library/ms743695.aspx INotifyPropertyChanged का उपयोग करना होगा: आप संग्रह को विभाजित और अलग-अलग प्रॉपर्टी सेट अप करने की आवश्यकता होगी)।

+0

मैंने माना कि लेकिन मैं सरणी में प्रत्येक तत्व के लिए एक संपत्ति नहीं चाहता; ऐसा करने के लिए एक बुरा तरीका लगता है। – statikuz

0

यह मेरे लिए काम किया:

NotifyPropertyChanged("") 
संबंधित मुद्दे