পর্যবেক্ষণযোগ্য সংগ্রহ এবং বাইন্ডলিস্টের মধ্যে পার্থক্য


236

আমি এর মধ্যে পার্থক্যটি জানতে চাই ObservableCollectionএবং BindingListকারণ আমি উত্সের কোনও পরিবর্তন / মোছার পরিবর্তনের জন্য উভয়কেই অবহিত করতে ব্যবহার করেছি, তবে আমি কখনই অপরটির চেয়ে বেশি পছন্দ করি তা জানি না।

আমি নীচের একটিকে অন্যটির চেয়ে কেন বেছে নেব?

ObservableCollection<Employee> lstEmp = new ObservableCollection<Employee>();

অথবা

BindingList<Employee> lstEmp = new BindingList<Employee>();

উত্তর:


278

ObservableCollectionকোনও সংগ্রহের মতো ইউআই থেকে একটি আপডেট করা যেতে পারে। সত্য পার্থক্য বরং সোজা:

ObservableCollection<T>কার্যকরী INotifyCollectionChangedযখন সংগ্রহে পরিবর্তিত হয় যা প্রজ্ঞাপন প্রদান করে (আপনি অনুমিত ^^) যখন বাঁধাই ইঞ্জিন UI 'তে আপডেট করতে পারবেন ObservableCollectionআপডেট করা হয়।

তবে, BindingList<T>প্রয়োগ IBindingList

IBindingListসংগ্রহের পরিবর্তনের বিষয়ে বিজ্ঞপ্তি সরবরাহ করে তবে এটিই নয়। এটি সম্পূর্ণ কার্যকারিতা সরবরাহ করে যা কেবলমাত্র ইউআই আপডেটের চেয়ে আরও অনেক কিছু সরবরাহ করতে ইউআই ব্যবহার করতে পারে যেমন:

  • শ্রেণীবিভাজন
  • অনুসন্ধানের
  • কারখানার মাধ্যমে যুক্ত করুন (অ্যাডনিউ সদস্য ফাংশন)।
  • পঠনযোগ্য তালিকা (সম্পত্তি সম্পাদনা)

এই সমস্ত কার্যকারিতা পাওয়া যায় না ObservableCollection<T>

আর একটি পার্থক্য হ'ল BindingListরিলে আইটেমগুলি পরিবর্তন করে যখন আইটেমগুলি প্রয়োগ করে INotifyPropertyChanged। যদি কোনও আইটেম কোনও PropertyChangedইভেন্ট উত্থাপন করে , তবে এটি BindingListতার ListChangedEventসাথে একটি উত্থাপন করবে ListChangedType.ItemChangedএবং OldIndex=NewIndex(যদি কোনও আইটেম প্রতিস্থাপন করা হয়েছে OldIndex=-1)। ObservableCollectionআইটেম বিজ্ঞপ্তি রিলে না।

দ্রষ্টব্য যে সিলভারলাইটে, BindingListবিকল্প হিসাবে উপলভ্য নয়: আপনি তবে ObservableCollectionএস ব্যবহার করতে পারেন এবং ICollectionView(এবং IPagedCollectionViewযদি আমার ভাল মনে থাকে)।


5
আরেকটি বিষয় বিবেচনা করার জন্য পারফরম্যান্স, দেখুন: themissingdocs.net/wordpress/?p=465
জারেক মাজুর

আপনাকে ধন্যবাদ, আমি বাইন্ডিংলিস্টের প্রকৃত বাস্তবায়ন সম্পর্কে অবগত ছিলাম না। আমি পর্যবেক্ষণযোগ্য সংগ্রহ এবং আইকোলিকেশনভিউ
ইলিস্ট্রাই

5
যদিও এই উত্তরের তথ্যটি সঠিক, কোনও ডাব্লুপিএফ ব্যবহারকারীদের সাবধান হওয়া উচিত: বন্ডিংলিস্ট আইএনটিফাইকোলকেশন পরিবর্তনগুলি প্রয়োগ করে না এবং যদি কোনও নিয়ন্ত্রণের আইটেমসোর্স সম্পত্তিতে আবদ্ধ থাকে তবে মেমরি ফাঁস হতে পারে। পর্যবেক্ষণযোগ্য সংগ্রহটি ইন্টারফেসটি বাস্তবায়িত করে এবং এ জাতীয় কোনও ফাঁস ঘটায় না।
ব্র্যান্ডন হুড

1
যদি বাইন্ডিংলিস্ট বাছাই কার্যকর করে, তবে আপনি কেন একটি বন্ডিংলিস্টের সাথে আবদ্ধ গ্রিডকে বাছাই করতে পারবেন না?
রবার্ট হার্ভে

কি BindingListঅপ্রচলিত?
শিমি ওয়েইজহ্যান্ডলার 4

27

ব্যবহারিক পার্থক্য হ'ল বাইন্ডিংলিস্টটি উইনফোর্ডের জন্য, এবং অবজার্ভযোগ্য সংগ্রহটি ডাব্লুপিএফের জন্য।

ডাব্লুপিএফ দৃষ্টিকোণ থেকে, বাইন্ডিংলিস্ট সঠিকভাবে সমর্থিত নয় এবং আপনি যদি সত্যিই না চান তবে আপনি কখনই ডাব্লুপিএফ প্রকল্পে এটি ব্যবহার করতে পারবেন না।


1
মজাদার. সিলভারলাইট দেব হিসাবে, আমি এটি জানতাম না। ধন্যবাদ। এবং আপনি যদি বাছাই এবং ফিল্টারিং করতে চান, আইকোলিকেশনভিউ বাস্তবায়নগুলি আপনার বন্ধু ^^
এলিস্ট্রেই

27
কেন এটি "সমর্থিত নয়"? ভিউ ম্যানেজার (অভ্যন্তরীণ) উপস্থাপনা ফ্রেমওয়ার্ক সমাবেশের মধ্যে রয়েছে এবং এটি এটি সমর্থন করে। উদাহরণস্বরূপ এটি একটি আইটেমস নিয়ন্ত্রণে বেঁধে রাখুন এবং পরিবর্তনের বিজ্ঞপ্তিগুলি সম্মানিত হয় (যেমন আইটেমগুলি যুক্ত এবং সরানো হয়)। এটি যদি উইনফর্মস নির্দিষ্ট হয় তবে কি এটি ফর্মের নেমস্পেসে আরও ভাল স্থাপন করা উচিত নয়?
ডেভিড কিফ

7
ডেভিডের সাথে একমত, এটি সিস্টেমে রয়েছে Col সংগ্রহের নেমস্পেস যাতে এটি ডাব্লুপিএফ দ্বারা পুরোপুরি সমর্থন করা উচিত। ডাব্লুপিএফ হ'ল ইউআই লেআউটের একটি আলাদা উপায়।
জাস্টিন

13
ডেভিডের সাথেও সম্মত হোন, আমি ডাব্লুপিএফ-তে প্রায়শই বন্ডিংলিস্ট ব্যবহার করি কারণ পর্যবেক্ষণযোগ্য সংগ্রহটি তার আইটেমগুলি থেকে সম্পত্তি পরিবর্তনের বিজ্ঞপ্তিগুলি বাধা দেবে না।
অ্যামনেসিয়া

3
"সাপোর্টার্ট নয়" এর উদাহরণ দেওয়ার জন্য: আমি আমার ডাব্লুপিএফ অ্যাপ্লিকেশনটিতে কেবল একটি মেমরি ফাঁস পেয়েছি যা কিছু বাইন্ডলিস্টগুলি আইএনটিফাইকোলিকেশন পরিবর্তন না করে
ব্রীজ

4

অন্তর্ভুক্ত উপাদানগুলি সম্পর্কে বৈশিষ্ট্য এবং পরিবর্তন সংক্রান্ত বিজ্ঞপ্তিগুলির মতো সর্বাধিক গুরুত্বপূর্ণ পার্থক্যগুলি ইতিমধ্যে স্বীকৃত উত্তর দ্বারা উল্লিখিত হয়েছে তবে আরও রয়েছে, যা উল্লেখ করার মতো:

কর্মক্ষমতা

যখন AddNewডাকা হয়, তখন BindingList<T>অনুসন্ধানের সাথে যুক্ত হওয়া আইটেমটি IndexOfঅনুসন্ধান করে। এবং যদি পরিবর্তিত উপাদানের সূচকটি Tকার্যকর INotifyPropertyChangedকরে তবে এটিও অনুসন্ধান করা হয় IndexOf(যদিও একই আইটেমটি বারবার পরিবর্তন হয় ততক্ষণ কোনও নতুন চেহারা নেই)। আপনি যদি সংগ্রহে কয়েক হাজার উপাদান সংরক্ষণ করেন তবে তারপরে ObservableCollection<T>(বা IBindingListও (1) চেহারা ব্যয় সহ একটি কাস্টম বাস্তবায়ন) আরও বেশি পছন্দনীয় হতে পারে।

সম্পূর্ণতা

  • IBindingListইন্টারফেস বিপুল এক (হয়তো না পরিষ্কার নকশা) এবং প্রয়োগকারীরা তার বৈশিষ্ট্য শুধুমাত্র একটি উপসেট বাস্তবায়ন করতে পারবেন। উদাহরণস্বরূপ, AllowNew, SupportsSortingএবং SupportsSearchingবৈশিষ্ট্য কিনা বলতে AddNew, ApplySortএবং Findপদ্ধতি যথাক্রমে ব্যবহার করা যাবে। এটি প্রায়শই লোককে আশ্চর্য করে যে BindingList<T>নিজে বাছাই করা সমর্থন করে না। প্রকৃতপক্ষে এটি কিছু ভার্চুয়াল পদ্ধতি সরবরাহ করে যা উত্পন্ন ক্লাসগুলি অনুপস্থিত বৈশিষ্ট্যগুলি যুক্ত করতে দেয়। DataViewবর্গ একটি পূর্ণ জন্য একটি উদাহরণ IBindingListবাস্তবায়ন; তবে এটি প্রথম স্থানে টাইপ করা সংগ্রহের জন্য নয়। এবং BindingSourceউইনফোর্মে ক্লাসটি একটি হাইব্রিড উদাহরণ: এটি বাছাইকে সমর্থন করে যদি এটি অন্য কোনও IBindingListপ্রয়োগকে আবৃত করে , যা বাছাই সমর্থন করে।

  • ObservableCollection<T>ইতিমধ্যে INotifyCollectionChangedইন্টারফেসের সম্পূর্ণ বাস্তবায়ন (যার কেবলমাত্র একটি ইভেন্ট রয়েছে)। এটিতে ভার্চুয়াল সদস্যও রয়েছে তবে ObservableCollection<T>এটি সাধারণত তার বেস Collection<T>শ্রেণীর জন্য একই কারণে উত্পন্ন হয় : বাধ্যতামূলক বৈশিষ্ট্যগুলি সামঞ্জস্য করার পরিবর্তে আইটেমগুলি অ্যাড / রিমুভ (যেমন একটি ডেটা মডেল সংগ্রহের ক্ষেত্রে) কাস্টমাইজ করার জন্য।

কপি বনাম মোড়ানো

উভয় ObservableCollection<T>এবং BindingList<T>একজন কনস্ট্রাক্টর রয়েছে, যা ইতিমধ্যে বিদ্যমান তালিকা গ্রহণ করে। যদিও তারা অন্য সংগ্রহের মাধ্যমে তাত্ক্ষণিকভাবে আচরণ করার সময় তারা আলাদা আচরণ করে:

  • BindingList<T>সরবরাহিত তালিকার জন্য পর্যবেক্ষণযোগ্য মোড়ক হিসাবে কাজ করে এবং এর উপর সম্পাদিত পরিবর্তনগুলি BindingList<T>অন্তর্নিহিত সংগ্রহের উপরও প্রতিফলিত হবে।
  • ObservableCollection<T>অন্যদিকে List<T>বেস Collection<T>কনস্ট্রাক্টরের কাছে একটি নতুন উদাহরণ পাস করে এবং মূল সংগ্রহের উপাদানগুলি এই নতুন তালিকায় অনুলিপি করে। অবশ্যই, যদি Tউপাদানগুলির মধ্যে কোনও রেফারেন্স ধরণের পরিবর্তনগুলি আসল সংগ্রহ থেকে দৃশ্যমান হয় তবে সংগ্রহটি নিজেই আপডেট হবে না।

1

এর মধ্যে আরও একটি বড় পার্থক্য হ'ল এটি কার্যকর ObservableCollectionএবং এ BindingListবিষয়টিতে একটি বিড সিদ্ধান্তের কারণ হতে পারে:

BindingList তালিকা পরিবর্তন হ্যান্ডলার:

বাইন্ডলিস্ট তালিকা পরিবর্তন

ObservableCollection সংগ্রহ পরিবর্তন:

পর্যবেক্ষণযোগ্য সংগ্রহ সংগ্রহ পরিবর্তন হয়েছে

উপরে সংক্ষিপ্ত বিবরণ: যদি কোনও আইটেমের সম্পত্তি পরিবর্তিত হয় BindingList, ListChangedইভেন্টটি আপনাকে সম্পত্তির সম্পূর্ণ বিবরণ দেবে (সম্পত্তি বিবরণীতে) এবং ObservableCollectionআপনাকে তা দেয় না। আসলে ObservableCollectionকোনও আইটেমের পরিবর্তিত কোনও সংস্থার পরিবর্তনের ইভেন্ট উত্থাপন করবে না।

উপরোক্ত উপসংহারটি INotifyPropertyChangedমডেল ক্লাসগুলিতে প্রয়োগের ক্ষেত্রে রয়েছে। কোনও আইটেমে সম্পত্তি পরিবর্তিত হলে ডিফল্টরূপে কেউই পরিবর্তিত ইভেন্ট উত্থাপন করে না।


আমি মনে করি এটি (প্রপার্টি বর্ণনাকারী) মেমরি ফাঁসের জন্য উত্স হতে পারে
আব্দুলকারিম কানান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.