خلاصه‌ای کاربردی در مورد Observable collection
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: دو دقیقه


Observable collection در WPF را می‌توان نوعی لیست جنریک ویژه تعریف کرد که زمانیکه به کنترلی بایند شد، کنترل را از تغییرات خودش آگاه می‌کند. برای مثال اگر آیتمی به این لیست اضافه شد بلافاصله آن آیتم را در کنترل مقید به آن نیز خواهید دید، به همین ترتیب در مورد ویرایش و یا حذف یک آیتم، بدون نیاز به کوچکترین تماسی با کنترل مورد نظر. برای مثال اگر مقدار یک خاصیت را تغییر دادید، بلافاصله بدون اینکه به کنترل مقید به آن اعلام کنیم که لطفا این مورد ویژه را برای من تغییر بده، شاهد نتیجه‌ی نهایی خواهیم بود.



اما استفاده‌ی پیشرفته از این لیست جنریک ویژه به همینجا ختم نشده و حین اضافه کردن کمی پیچیدگی به برنامه مشکلات عدیده‌ای بروز می‌کنند که آن‌ها را جهت دسترسی ساده‌ی بعدی در زیر لیست می‌کنم:

الف) اصلا Observable collection چیست؟ چکار می‌کند؟
List vs ObservableCollection vs INotifyPropertyChanged in Silverlight

ب) نمی‌توانم از این مجموعه‌ی اشیای خودآگاه سازنده در یک ترد استفاده کنم. مشکل کجاست؟
این روزها نمی‌توان یک برنامه‌ی دسکتاپ خوب را بدون استفاده از تردها متصور شد. اما به محض سعی در به روز رسانی این لیست جنریک در یک ترد دیگر (ترد دیگر منظور هر تردی بجز ترد اصلی برنامه است که کار مدیریت رابط کاربر را به عهده دارد) خطای زیر ظاهر می‌شود:
This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread

راه حل:
Adding to an ObservableCollection from a background thread

ج) یکی از خاصیت‌های یک شیء این لیست جنریک ویژه را تغییر داده‌ام. اما هیچ تغییری در کنترل بایند شده به آن مشاهده نمی‌کنم. مشکل در کجاست؟
راه حل: پیاده سازی اینترفیس INotifyPropertyChanged را فراموش کرده‌اید:
Data Binding in WPF with the Monostate Pattern

د) خوب، این که خیلی دردسر دارد! راه ساده‌تری برای تعریف این موارد نیست؟!
هوشمندانه‌ترین روشی که برای حل این مساله تابحال دیده‌ام:
An easier way to manage INotifyPropertyChanged

ه) زمانیکه این یک لیست جنریک خودآگاه سازنده را به یک مثلا listview بایند می‌کنم، دیگر نمی‌توانم با استفاده از متد clear items آن کنترل، نسبت به خالی کردن نمای ظاهری آن اقدام کنم. چکار باید کرد؟
خطای مشاهده شده:
Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead

راه حل:
همان Observable collection اصلی را تخلیه کنید، UI به صورت خودکار به روز خواهد شد.

و) اضافه کردن رنجی از اطلاعات به آن به صورتی یکباره ممکن است کند باشد. چه باید کرد؟
راه حل:
AddRange for ObservableCollection in Silverlight 3


  • #
    ‫۱۴ سال و ۸ ماه قبل، جمعه ۱۴ اسفند ۱۳۸۸، ساعت ۱۷:۳۴
    تا پیش از این , این الگو فقط در WPF از طرف ماکروسافت پیاده سازی شده بود ولی در net 4. ماکروسافت اون رو به عنوان بخشی از BCL در نظر گرفته
  • #
    ‫۱۴ سال و ۸ ماه قبل، جمعه ۱۴ اسفند ۱۳۸۸، ساعت ۱۷:۴۰
    البته بهتره بگیم استفاده از این الگو وگرنه تعریف آن در فضای نام system قرار دارد (System.Collections.ObjectModel) .
  • #
    ‫۱۴ سال و ۸ ماه قبل، جمعه ۱۴ اسفند ۱۳۸۸، ساعت ۲۰:۱۱
    ممنون از مطالب مفید شما واقعا بر روی لبه تکنولوژی های دات نت قدم بر می دارید. در مورد COLLECTION های OBSERVABLE این نکته هم حائز اهمیت است که این لیست ها دقیقا به اندازه نیاز کاربر در UI برنامه مقادیر را در حافظه لود کرده و اصطلاحا می توان با بکاربری این COLLECTIONها در یک کنترل خاصیت LazyLoading به کنترل بخشید.
  • #
    ‫۱۴ سال و ۷ ماه قبل، چهارشنبه ۱۹ اسفند ۱۳۸۸، ساعت ۱۳:۰۰
    ممنون از مطالب مفیدتون...
    اگه ممکنه قسمت خبر ها و تازه های دنیای کامپیوتر رو دوباره اضافه کنید...
    از لینک های که می گذاشتید به یه عالمه تازه ای بیشتر می رسیدیم.
  • #
    ‫۱۴ سال و ۷ ماه قبل، چهارشنبه ۱۹ اسفند ۱۳۸۸، ساعت ۱۴:۲۹
    سلام
    هنوز هم اینکار رو می‌کنم. اما محل انتشار آن تغییر کرده:
    http://www.idevcenter.com/links/upcoming
  • #
    ‫۱۴ سال و ۷ ماه قبل، چهارشنبه ۱۱ فروردین ۱۳۸۹، ساعت ۰۰:۳۳
    تو این CheckForIllegalCrossThreadCalls نیست؟ اینکار استفاده از Thread بسیار کم میکنه!
  • #
    ‫۱۴ سال و ۷ ماه قبل، چهارشنبه ۱۱ فروردین ۱۳۸۹، ساعت ۰۴:۰۴
    چرا، Dispatcher.CheckAccess دارد.