2009-04-12 27 views
5

मेरे पास एक अवलोकन करने योग्य चयन है जो WPF में ListBox से जुड़ा हुआ है। मैं सूची बॉक्स को संपादन योग्य बनाना चाहता हूं, और संपादन में बदलावों को संग्रह में सहेजने के लिए। चूंकि डब्ल्यूपीएफ एक संपादन योग्य सूची बॉक्स प्रदान नहीं करता है, इसलिए मैंने ListBox.ItemTemplate को बदलकर अपना खुद का निर्माण करने का प्रयास किया है।संपादन योग्य WPF ListBox

<ListBox.ItemTemplate> 
    <DataTemplate>      
     <TextBox Name="EditableText" Text="{TemplateBinding Content}"/> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

ItemTemplate बदलने मुझे संपादन योग्य बॉक्स देता है, लेकिन बक्सें में कोई परिवर्तन न ObservableCollection को बचाया मिलता है। क्या संपादन योग्य लिस्टबॉक्स को दो तरह से बाध्यकारी करने का कोई तरीका है?

उत्तर

8

आप इसे इस तरह से नहीं कर सकते हैं।

उस तरह की चाल प्राप्त करने के लिए, आपको अपने आइटम "धारक वर्ग" होने की आवश्यकता होगी जो उस संपत्ति का खुलासा करे जिससे आप अपना टेक्स्टबॉक्स बांध सकें।

इसे समझने के लिए, यह अनुमान कॉल की निम्नलिखित छद्म अनुक्रम:

class ListBox 
{ 
    Bind(Items) 
    { 
    foreach(var item in Items) 
    { 
     DataTemplate Template = LoadTemplateForItem(item.GetType()); // this is where your template get loaded 
     Template.Bind(item); //this is where your template gets bound 
    } 
    } 
} 

आपका टेम्पलेट (लिस्टबॉक्स साथ DataTemplate) भरी हुई है और आइटम (जो मुझे लगता है आपके मामले में एक स्ट्रिंग है) पारित हो में इस बिंदु पर, यह केवल स्ट्रिंग को जानता है, और ऊपर की ओर कुछ भी प्रभावित नहीं कर सकता है। एक दो-तरफा बाध्यकारी संग्रह को प्रभावित नहीं कर सकता क्योंकि टेम्पलेट यह नहीं जानता कि किस संदर्भ में इसका उपयोग किया जा रहा है, इसलिए यह मूल संग्रह पर वापस नहीं पहुंच सकता है और इसकी सामग्री को संशोधित नहीं कर सकता है। उस मामले के लिए, टेक्स्टबॉक्स के लिए यह वही बात है। यदि इसे एक कंटेनर और संपत्ति का नाम नहीं दिया जाता है, तो इसमें परिवर्तनों को "वापस स्टोर" करने के लिए कहीं भी नहीं है। यह मूल रूप से फ़ंक्शन कॉल में स्ट्रिंग को पास करने जैसा ही है। फ़ंक्शन बदल नहीं सकता है जिसमें कौन सी स्ट्रिंग पारित की गई थी (ट्रिक्स को अनदेखा करना जैसे संदर्भ-संदर्भ तर्क पास करना)।

public class MyDataItem 
{ 
    string Data { get; set;} 
} 

तो फिर तुम उन का संग्रह करने के लिए अपने ListBox बाध्य कर सकते हैं:

अपने मामले को वापस पाने के लिए आपको जिन वस्तुओं पर एक संपत्ति के मूल्य संपादित करने की आवश्यकता है कि युक्त बेनकाब का एक संग्रह का निर्माण करने की जरूरत है आइटम और संशोधित आपके डेटामैप्लेट:

<ListBox.ItemTemplate> 
    <DataTemplate>            
      <TextBox Name="EditableText" Text="{Binding Data, Mode=TwoWay}"/> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
+0

मुझे एक ही समस्या है, लेकिन क्योंकि मैं WPF के साथ बहुत नया हूं, मुझे नहीं पता कि {बाइंडिंग डेटा, मोड = दोवे} कैसे लिखना है यदि मेरे पास तारों की सूची है और कोई वास्तविक संपत्ति नहीं है जो –

+1

बाध्य हो सकती है नहीं, यह मेरे उत्तर का मुद्दा है ... आपको तारों की अपनी सूची लेने की आवश्यकता है, उन तारों को रखने वाली वस्तुओं की एक सूची बनाएं (प्रत्येक ऑब्जेक्ट में एक स्ट्रिंग है, जो किसी संपत्ति के माध्यम से सुलभ है), और सूची बॉक्स में द्वितीयक सूची प्रदर्शित करें । –

0

एक आदर्श संपत्ति के लिए बाध्य करें - यानी डेटा ऑब्जेक्ट की एक संपत्ति - सामग्री जैसी दृश्य संपत्ति के बजाय। उदाहरण के लिए:

// model class 
public class Widget : INotifyPropertyChanged 
{ 
    public string Description { ... } 
} 

<!-- view --> 
<DataTemplate> 
    <TextBox Text="{Binding Description}" /> 
</DataTemplate> 

नोट इस अगर आपके ItemsSource ObservableCollection है (वहाँ के लिए बाध्य करने के लिए कोई संपत्ति है, क्योंकि) काम नहीं करेगा।

+0

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

+0

डेटा टेम्पलेट आइटम के संग्रह के प्रत्येक सदस्य के लिए उस सदस्य को बाध्यकारी सेट के साथ दोहराया जाता है। – itowlson

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