2011-06-06 22 views
10

मेरे WPF ऐप में मेरे पास XamDataGrid है। ग्रिड एक अवलोकन करने योग्य चयन के लिए बाध्य है। मुझे उपयोगकर्ताओं को ग्रिड के माध्यम से नई पंक्तियां डालने की अनुमति देने की आवश्यकता है, लेकिन यह पता चला है कि "नई पंक्ति जोड़ें" पंक्ति उपलब्ध होने के लिए, xamDataGrid के स्रोत को आईबींडिंगलिस्ट को लागू करने की आवश्यकता है। अवलोकन योग्य चयन उस इंटरफ़ेस को लागू नहीं करता है।WPF ObservableCollection <T> बनाम बाध्यकारी सूची <T>

अगर मैं अपने स्रोत को बाइंडिंगलिस्ट में बदलता हूं, तो यह ठीक काम करता है। हालांकि, मैं इस विषय पर पढ़ने से क्या समझ सकता हूं, बाइंडिंगलिस्ट वास्तव में एक WinForms चीज है और पूरी तरह से WPF में समर्थित नहीं है।

क्या मैं गलती कर रहा हूं अगर मैंने अपने सभी अवलोकन करने योग्य चयनों को बाध्यकारी सूची में बदल दिया? क्या किसी के पास कोई अन्य सुझाव है कि स्रोत को अवलोकन करने योग्य चयन के रूप में रखते हुए मैं अपने xamDataGrid के लिए नई पंक्ति कार्यक्षमता कैसे जोड़ सकता हूं? यह मेरी समझ है कि कई अलग-अलग ग्रिड हैं जिनके लिए नई पंक्ति कार्यक्षमता जोड़ने के लिए आईबीआईंडलिस्ट को कार्यान्वित करने की आवश्यकता है, लेकिन अधिकांश समाधान जो मैं देखता हूं वह केवल बाइंडिंगलिस्ट पर स्विच करना है।

धन्यवाद।

+1

पहली जगह XamDatagrid क्या है? क्या आपका मतलब डब्ल्यूपीएफ टूलकिट डाटाग्रिड है? एक तीसरा पक्ष घटक? क्या आप कुछ नमूना कोड भी पोस्ट कर सकते हैं :) – Bruno

+1

@ ब्रूनो इट्स इंफ्राजिस्टिक का डेटाटाइड – Rachel

उत्तर

3

IBindingList इंटरफ़ेस और BindingList कक्षा सिस्टम में परिभाषित की गई है। कॉम्पोनेंट मॉडल नामस्थान, और इसलिए सख्ती से विंडोज फॉर्म संबंधित नहीं हैं।

क्या आपने जांच की है xamGridICollectionView स्रोत पर बाध्यकारी का समर्थन करता है? यदि ऐसा है, तो आप इस इंटरफ़ेस का उपयोग करके अपने डेटा स्रोतों का खुलासा कर सकते हैं और इसे BindingListCollectionView का उपयोग करके वापस कर सकते हैं।

तुम भी ObservableCollection<T> का एक उपवर्ग बना सकते हैं और IBindingList इंटरफ़ेस को लागू कर सकते हैं:

using System; 
using System.ComponentModel; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 

public class ObservableBindingList<T> : ObservableCollection<T>, IBindingList 
{ 
    // Constructors 
    public ObservableBindingList() : base() 
    { 
    } 

    public ObservableBindingList(IEnumerable<T> collection) : base(collection) 
    { 
    } 

    public ObservableBindingList(List<T> list) : base(list) 
    { 
    } 

    // IBindingList Implementation 
    public void AddIndex(PropertyDescriptor property) 
    { 
     throw new NotImplementedException(); 
    } 

    public object AddNew() 
    { 
     throw new NotImplementedException(); 
    } 

    public bool AllowEdit 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public bool AllowNew 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public bool AllowRemove 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public void ApplySort(PropertyDescriptor property, ListSortDirection direction) 
    { 
     throw new NotImplementedException(); 
    } 

    public int Find(PropertyDescriptor property, object key) 
    { 
     throw new NotImplementedException(); 
    } 

    public bool IsSorted 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public event ListChangedEventHandler ListChanged; 

    public void RemoveIndex(PropertyDescriptor property) 
    { 
     throw new NotImplementedException(); 
    } 

    public void RemoveSort() 
    { 
     throw new NotImplementedException(); 
    } 

    public ListSortDirection SortDirection 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public PropertyDescriptor SortProperty 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public bool SupportsChangeNotification 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public bool SupportsSearching 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public bool SupportsSorting 
    { 
     get { throw new NotImplementedException(); } 
    } 
} 

वैकल्पिक रूप से, आप BindingList<T> उपवर्ग और INotifyCollectionChanged इंटरफ़ेस को लागू कर सकते हैं।

0

मैं आईबीआईंडिंगलिस्ट से परिचित नहीं हूं, लेकिन शायद मैं एक एडाप्टर और/या एक्सटेंशन क्लास लिखने का दृष्टिकोण लेगा जो एक अवलोकन करने योग्य चयन को आईबींडिंगलिस्ट में अपनाने वाला है। इस तरह, आप अपने परिचित पर्यवेक्षण कोलेक्शन कोड (और इन्फ्राजिस्टिक डेटाग्रिड के अलावा अन्य स्थानों में भी इसका उपयोग कर सकते हैं) रख सकते हैं।

0

मुझे लगता है कि आप किसी भी तरह से भाग्य से बाहर हैं। आईबींडिंगलिस्ट पूरी तरह से ग्रिड द्वारा समर्थित नहीं होगा, इसलिए आप चीजों को खोने जैसी चीज़ों को खो देंगे। लेकिन ओसी AddNew व्यवहार नहीं करता है।

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

0

आप NetAdvantage 2011 तक उन्नयन खंड 2 नया रिकार्ड है जब एक ObservableCollection करने के लिए बाध्य काम करेंगे जोड़ सकते हैं।

यदि आप NetAdvantage 2011 वॉल्यूम 1 या पुराने का उपयोग कर रहे हैं, तो XamDataGrid IEDitableCollectionView इंटरफ़ेस का भी समर्थन करता है जब इसकी CanAddNew प्रॉपर्टी सही होती है। आप ListCollectionView का उपयोग अपने ऑब्जर्जेबल कोलेक्शन का उदाहरण दे सकते हैं और फिर XamDataGrid को ListCollectionView में बाध्य कर सकते हैं।

आप पर्यवेक्षित चयन से प्राप्त करने और आपके व्युत्पन्न वर्ग पर आईबींडिंगलिस्ट को लागू करने के पिछले सुझाव का भी उपयोग कर सकते हैं।

+0

का संस्करण मैंने v11.2 में अपग्रेड किया है लेकिन यह अभी भी काम नहीं करता है। बीएल के साथ ओसी की जगह लेते समय यह फिर से काम करता है। क्या मुझे कोई सेटिंग सेट करना है? – Marek

+0

@marek एकमात्र सेटिंग जरूरी है जो AllowAddNew को FieldLayoutSettings पर सही पर सेट किया गया है, जिसकी आवश्यकता है कि आप बाइंडिंगलिस्ट या एक ऑब्जर्वेबल कोलेक्शन का उपयोग करें। मैंने आज सुबह 11.2 के साथ इसका परीक्षण किया और AddNewRow एक ObservableCollection के साथ काम करता है। यदि आप एक नमूना प्रदान कर सकते हैं कि मैं देख सकता हूं कि यह कहां काम नहीं करता है तो मैं एक नज़र डालेगा। – alhalama

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