
آموزش ام وی وی ام (MVVM) پیشرفته و پروژه محور در WPF
آموزش ام وی وی MVVM پیشرفته و پروژه محور در دبلیو پی اف WPF یکی دیگر از آموزش های گروه آموزشی پرووید می باشد که در این قسمت آن را به شما معرفی می کنیم. این بسته ی آموزشی نیز یکی از دوره های آموزشی دیگر که در حوزه ی فارسی سازی آموزش های انگلیسی تنظیم شده است می باشد. عنوان این بسته ی آموزشی ترمیم پیشرفته مدل در WPF و MVVM است که با نام اصلی WPF and MVVM: Advanced Model Treatment از شرکت Pluralsight منتشر شده است.
MVVM چیست؟
به عنوان یک توسعه دهنده ی نرم افزار در تکنولوژی های WPF و Silverlight چرا باید با الگوی MVVM آشنا بوده و نحوه ی پیاده سازی آن و نکاتش را بدانید؟
- آیا شما به عنوان یک توسعه دهنده ی نرم افزار بصورت همزمان با یک طراح واسط کاربری بر روی یک پروژه کار می کنید؟
- آیا به Unit Testing کامل نیاز دارید؟
- آیا داشتن Component هایی که قابل استفاده مجدد یا اصطلاحاً Reusable هستند برای شما مهم است؟
- آیا تغییر واسط کاربری نرم افزار بدون هیچ تغییری در کار منطق تجاری (Business Logic) برای شما اهمیت دارد؟
اگر جواب یکی از سوال های بالا “بله” باشد، شما نیاز به استفاده از MVVM در برنامه های خود دارید.

الگوی طراحی MVVM یک عضو جدا نشدنی از توسعه ی نرم افزار با WPF و Silverlight است. بعد از یادگیری این الگو و نحوه ی پیاده سازی آن خواهید دید که ویژگی های WPF و Silverlight چنان از الگوی MVVM پشتیبانی می کنند که پیاده سازی یک نرم افزار در این تکنولوژی ها بدون این الگو کار دشوارتری خواهد شد. تعدادی از این ویژگی ها در WPF و Silverlight که این دو را برای پیاده سازی الگوی MVVM بسیار مناسب کرده است عبارت اند از:
سیستم Data Binding وجود Data Template ها Command ها
جالب است بدانید که خود مایکروسافت از MVVM برای تولید نرم افزارهایی شبیه Expression Blend استفاده کرده است.

ضمناً توصیه می کنیم که از دو محصول دیگر که از همین تولید کننده منتشر شده اند و در آموزش ساخت یک Enterprise Application با WPF و MVVM و Entity Framework و آموزش پیاده سازی MVVM در دبلیو پی اف WPF و Unit Test کردن ViewModel ها نیز استفاده کنید.
پیادهسازی Change Tracking برای مدلها در WPF
در برنامههای دسکتاپ مبتنی بر WPF، تغییر یک مقدار در رابط کاربری باید در مدل داده بازتاب پیدا کند و گاهی برنامه لازم دارد تغییرات انجامشده را نیز به خاطر بسپارد. این آموزش با استفاده از نمونه `FriendStorage` و کلاس `FriendWrapper`، به پیادهسازی Change Tracking و بازیابی تغییرات دادهای میپردازد. این رویکرد امکان بررسی مقدار اولیه و مقدار فعلی را فراهم میکند تا برنامه بتواند تغییرات کاربر را تشخیص دهد. برای نمونه، هنگام ویرایش اطلاعات یک دوست، ممکن است لازم باشد وضعیت فیلدهای تغییرکرده مشخص باشد یا بتوانید تفاوت مقدار فعلی یک ComboBox با مقدار اصلی آن را بررسی کنید.
درسهای مربوط به Initialize کردن مجموعه Wrapperها و نمایش تغییرات در CheckBox نشان میدهند که پیگیری تغییرات فقط به یک فیلد متنی محدود نیست و کنترلهای مختلف رابط کاربری نیز باید درست مدیریت شوند. با استفاده از Wrapper برای مدل، میتوان منطق مرتبط با نمایش و پیگیری وضعیت را از کلاس اصلی داده جدا نگه داشت. این طراحی در برنامههایی که فرمهای ویرایش، جدولهای داده یا چندین فیلد قابلتغییر دارند، کاربرد دارد. توسعهدهندگان WPF با بررسی این نمونهها میتوانند بفهمند چگونه تغییرات را ثبت کنند و ساختار لازم را برای تشخیص وضعیت دادههای ویرایششده در برنامه ایجاد کنند.
اعتبارسنجی Model و نمایش خطاها با INotifyDataErrorInfo
اعتبارسنجی در برنامههای WPF زمانی اهمیت دارد که داده ورودی باید پیش از ذخیره شدن با قواعد مشخصی مطابقت داشته باشد. این آموزش پیادهسازی `INotifyDataErrorInfo` را در یک کلاس پایه بررسی میکند و نشان میدهد چگونه وضعیت اعتبار دادهها را با پراپرتی `IsValid` در `FriendWrapper` بازتاب دهید. همچنین `Validation Attribute`ها و اینترفیس `IValidatableObject` مطرح میشوند تا با روشهای مختلف تعریف قواعد اعتبارسنجی آشنا شوید. چنین ساختاری کمک میکند منطق بررسی دادهها در مدل یا Wrapper سازماندهی شود و رابط کاربری بتواند نتیجه اعتبارسنجی را دریافت کند، بهجای آنکه همه قواعد در کنترلهای نمایشی پراکنده شوند.
نمایش خطاهای اعتبارسنجی نیز بخش مهمی از مثالهای آموزش است؛ از جمله نشان دادن خطاها در سلولهای `DataGrid`. در برنامههای واقعی، کاربر باید بتواند تشخیص دهد کدام مقدار پذیرفته نشده و چه بخشی از فرم نیاز به اصلاح دارد. آشنایی با اعلان تغییرات مدل و مدیریت خطاها در کنار تولید Model-wrapperها با استفاده از `T4`، دید گستردهتری از سازماندهی مدلها در پروژههای بزرگتر WPF ارائه میدهد. تولید Wrapperها با قالبهای T4 میتواند تکرار کدهای ساختاری مشابه را کاهش دهد و نگهداری مدلهای متعدد را منظمتر کند، بهویژه زمانی که هر Model-wrapper در فایل جداگانهای قرار میگیرد.
سرفصل مطالب آموزش ویدئویی MVVM پیشرفته و پروژه محور در WPF
فصل اول: مقدمه
- مقدمه
- بررسی سرفصل دوره آموزشی
- چرا سرویسها از کلاسهای POCO استفاده میکنند؟
- چالشهای استفاده از کلاس POCO در Client
- بررسی برنامه FriendStorage
- چالشهای استفاده از کلاسهای POCO در برنامه FriendStorage
- کلاسهای POCO در ViewModel
- استفاده از کلاس های POCO در یک Model-wrapper
- جمع بندی
فصل دوم: انجام Notification برای تغییرات رخ داده در Model
- مقدمه
- ایجاد کردن کلاس FriendWrapper
- نوشتن Setter و Getter برای Property Simple های مربوط به کلاس Model
- ارسال Notification در رابطه با تغییرات مربوط به Property Simple ها
- ریفکتور کردن Logic مشترک در یک Base-class
- استفاده از Reflection برای Set کردن و Get کردن مقادیر Property ها
- ارسال Notification در رابطه با تغییرات Complex Property ها
- ارسال Notification در رابطه با تغییرات مربوط به Collection- Property ها
- Initialize کردن Wrapper-collection
- همگام کردن دادههای Wrapper-collection و Model-collection
- استفاده کردن از FriendWrapper در برنامه FriendStorage
- جمع بندی
فصل سوم: ردگیری کردن تغییرات مربوط به Model
- مقدمه
- ردگیری کردن تغییرات Simple Property ها
- Get کردن Original Value مربوط به Simple Property ها
- Get کردن مقدار تغییر یافته مربوط به Simple Property ها
- ریفکتور کردن و ردگیری کردن کد با استفاده از قابلیت های سی شارپ ۶
- Get کردن تغییرات داده ای مربوط به FriendWrapper
- پذیرفتن تغییرات برای Simple Property ها
- رد کردن تغییرات برای Simple Property ها
- ردگیری کردن Complex Property ها
- ردگیری کردن Collection Property ها
- استفاده کردن از کلاس ChangeTrackingCollection در کلاس FriendWrapper
- حل کردن مشکل مربوط به همگام سازی Collection ها در ModelWrapper
- موارد استفاده از Change Tracking در برنامه FriendStorage
- فعال سازی و غیر فعال سازی دکمه Save
- چک کردن تغییرات در زمان بستن یک تب
- ریست کردن یک Friend به Original State مربوطه اش
- جمعبندی
فصل چهارم: نشان دادن تغییرات مربوط به Model
- مقدمه
- نشان دادن تغییرات در یک TextBox
- ریفکتور کردن Logic در یک TextBox Style مشترک
- Bind کردن Property های مربوط به ChangeBehavior به صورت Dynamic
- نشان دادن تغییرات در یک CheckBox
- ایجاد کردن یک Base Style برای نشان دادن تغییرات
- نشان دادن تغییرات در یک DatePicker
- تبدیل کردن Original Value ها در ChangeBehavior
- تبدیل کردن Original Value های مربوط به DatePicker
- تنظیم کردن Original Value Converter در یک Style
- نشان دادن تغییرات در یک ComboBox
- تبدیل کردن Original Value های مربوط به ComboBox
- نشان دادن تغییرات در یک DataGrid
- ایجاد کردن یک Element Style به صورت Dynamic
- هندل کردن عناصر اضافه شده و حذف شده
- نشان دادن تغییرات در یک Tab-header
- جلوگیری کردن از بسته شدن برنامه FriendStorage
- جمع بندی
فصل پنجم: پیادهسازی اعتبار سنجی در Model
- مقدمه
- معرفی اینترفیس INotifyDataErrorInfo
- پیاده سازی کردن اینترفیس INotifyDataErrorInfo در یک Base Class
- نوشتن تست های مربوط به Validation برای پروپرتی FirstName
- استفاده کردن از Data Annotation ها
- اعتبار سنجی کردن مقدار مربوط به پروپرتی FirstName با استفاده از Data Annotation ها
- اضافه کردن پروپرتی IsValid به ModelWrapper
- استفاده کردن از پروپرتی IsValid برای فعال کردن دکمه Save
- اعتبار سنجی کردن کلاس FriendWrapper به صورت کامل
- پیاده سازی کردن پروپرتی IsValid برای FriendWrapper
- استفاده کردن از اینترفیس IValidatableTrackingObject
- پیاده سازی کردن IsValid و Complex- Property ها
- پیاده سازی کردن IsValid و Collection-Property ها
- اعتبارسنجی کردن در سطح کلاس با اینترفیس IValidatableObject
- پیاده سازی یک نیازمندی جدید: هر برنامه نویس باید یک آدرس ایمیل داشته باشد
- Initialize کردن صحیح قبل از اعتبار سنجی
- بررسی Validation Attribute ها و اینترفیس IValidatableObject
- جمعبندی
فصل ششم: نشان دادن Validation Error ها
- مقدمه
- بررسی Validation Error ها در User Interface
- پررنگ کردن فیلدهای غیر معتبر
- نشان دادن خطاها در یک Tooltip
- تعریف کردن یک Custom Error Template
- حل کردن مشکل مربوط به CheckBox ها در نشان دادن خطا
- استفاده از Error Template برای DataGrid
- نشان دادن ارورها در سلول های DataGrid
- جلوگیری کردن از Validation برای Binding های خاص
- رنگی کردن Tab Header
- جمع بندی
فصل هفتم: تولید کردن Model-wrapper ها با استفاده از T4
- مقدمه
- مباحث اولیه در استفاده از T4
- اضافه کردن یک T4 Template برای تولید کردن Model-wrapper ها
- نصب کردن یک Extension برای T4 Syntax Highlighting
- ایجاد کردن یک کلاس Wrapper برای هر Model Class
- ایجاد کردن یک فایل جداگانه به ازای هر Model-wrapper
- ایجاد کردن Using ها و Namespace ها و Constructor ها
- ایجاد کردن Simple Property ها
- پشتیبانی کردن از Generic Type ها از قبیل Nullable
- ایجاد کردن Complex Property ها
- ایجاد کردن Collection- Property ها
- Initialize کردن Complex Property ها
- Initialize کردن Collection Property ها
- ایجاد کردن Validation Logic در Partial Class ها
- نسخه نهایی برنامه FriendStorage
- جمع بندی دوره آموزشی







