# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > WPF >  استفاده از الگوی M-V-VM

## m.bibjan

سلام من میخوام از الگوی M-V-VM استفاده بکنم ولی یه سوال پیش اومده واسم:

در عکس زیر قسمت سمت راست الگوی M-V-VM رو داره یا قسمت سمت چپ؟

نمیدونم از کدومیکش استفاده بکنم.خیلی گیرم انداخته لطفا راهنمایی کنید؟

----------


## m.bibjan

کاری به سوالهای بی جوابم ندارم.
ولی فکر نکنم توی تالار WPF کسی تردد داشته باشه.مسئولین نمیخوان فکری بکنن؟من این صفحه اول تالار رو که رفرش میکنم از بس که اساتید و مدیران جواب نمیدن روی تاپیک ها گرد و خاک نشسته.
مدیران کجای مجلسند؟این همه تاپیک بی جواب و جواب دار بی نتیجه.

----------


## Ehsan Programmer

> کاری به سوالهای بی جوابم ندارم.
> ولی فکر نکنم توی تالار WPF کسی تردد داشته باشه.مسئولین نمیخوان فکری بکنن؟من این صفحه اول تالار رو که رفرش میکنم از بس که اساتید و مدیران جواب نمیدن روی تاپیک ها گرد و خاک نشسته.


من هم با  شما موافقم تالار Silverlight - WPF  یکی از بدترین ها  برای سوال پرسیدن و جواب گرفتن است 
هر سوالی که پرسیدم بدون جواب ماند و تازه اگر هم کسی جواب داده فاقد محتوای فنی است
من یک سوال دارم . آیا کسی روی این زمینه ها کار نمیکنه و یا اینکه این مباحث سیلورلایت و WPF در حال منسوخ شدن است؟
و یا اینکه کاربران تمایلی به اشتراک گذاشتن تجربیات خود با دیگران ندارند؟

----------


## mze666

سلام - هر دوتاشون درست هستن. توی شکل سمت راست که ساختار پروژه های MVVM Ligth این جوری هستش (البته برا من فکر کنم پوشه Design) رو هم نداشت  :متفکر: . ولی به نظر من که سمت چپ *درست تر* هستش.

----------


## m.bibjan

ممنون ولی مطابق با توضیحات اقای نصیری توی اون pdf نیست ، چرا اینطوریه ؟یعنی ویژوال استودیو من اگر عکسش رو بهتون نشون بدم ، تمپلت هایی که داره اصلا این WPF Model-View Application رو نداره.اصلا پیداش نمیکنم.چکا رکنم درست بشه؟

----------


## PetekDincos

با سلام 
آیا شما فریم ورک MVVM Light Toolkit  را دانلود و نصب کردید اگر نه از این قسمت دانلود و نصب کنید
Light Toolkit
با تشکر

----------


## m.bibjan

اره نصبش کردم و نتیجه اش رو هم توی عکس بالا میتونید ببینید.ولی همه چیز رو میاره به غیر از اون چیزی که دنبالشم.چیزی به ذهنتوتن میرسه.از خود ویژوال من تمپلت های WPF  رو دانلود کردم ولی نمیارتش.دیگه نمیدونم چیکار کنم.شما پیشنهادی ندارین؟

----------


## m.bibjan

> من هم با  شما موافقم تالار Silverlight - WPF  یکی از بدترین ها  برای سوال پرسیدن و جواب گرفتن است 
> هر سوالی که پرسیدم بدون جواب ماند و تازه اگر هم کسی جواب داده فاقد محتوای فنی است
> من یک سوال دارم . آیا کسی روی این زمینه ها کار نمیکنه و یا اینکه این مباحث سیلورلایت و WPF در حال منسوخ شدن است؟
> و یا اینکه کاربران تمایلی به اشتراک گذاشتن تجربیات خود با دیگران ندارند؟


این عکس ها رو ببینید.در مورد این که میگین در حال منسوخ شدن هستش.کاری به سلایق کاری دوستان ندارم ولی ادم دلش میاد از این طرز برنامه نویسی اونم با این رابط کاربری بگذره ؟ شما دلت میاد جدا؟

این عکس ها رو ببیند و خودتون قضاوت کنید.به نظرم توی برنامه نوشتن چند تا چیز رعایت بشه خیلی نرم افزار حرفه ایی میتونه باشه.
 1 - رابط کاربری قوی مثل این عکسها و نمونه دیگر این عکسها( توی اینترنت سرچ نمونه های خوشگلترش هم هست)
2 - الگوی M- V -VM  
3 - مباحث شی گرایی 
4 - ..... 
البته از هر کدومش در جای خودش بطور صحیح استفاده بشه نرم افزار حرفه ایی میتونه باشه.


هر کی دلیل داره تنها نیست.

----------


## noroozifar

اقا من چند روزه وقتم را گذاشتم برای همین wpf و روش mvvm  و استفاده از entity framework کلا دارم از این روش خسته میشم اخه خیلی درکش برام سخت شده و تو مباحث اولیه این روش مانده ام  خیلی دلم میخواهد این روش را کامل یاد بیگرم   کلی پی دی اف و فیلم دان زدم اخر متوجه نمیشم باید چه کرد ؟

یک نفر با ای دی من تماس بگیره منو راه بندازه : alaydyn

----------


## m.bibjan

سلام این لینک میگه توی دو هفته بهتون WPF رو یاد میدم.یه نگاهی بندازین بدک نیست.

http://www.wpftutorial.net/LearnWPFin14Days.html

----------


## noroozifar

این لینک را دیده ام مشکل من اصل مطلب هستش یعنی  binding  و استفاده از بانک و mvvm دیگه استفاده از stackpanel یا grid مشکلی ندارم

----------


## m.bibjan

> استفاده از بانک و mvvm


این WPF Model-View Application  توی ویژوال شما هستش ؟
اگه اره چطوری اوردینش من نتونستم بیارمش چیکار کنم؟

----------


## noroozifar

برای من  mvvmViewModel(wpf با سی شارپ هستش    حالا کاربرد این چی هستش؟

----------


## m.bibjan

با استفاده از این تمپلیت میتونید این الگو ( mvvm ) رو توی نرم افزارتون پیاده سازی کنید.

حالا چطوری به تمپلیت هاتون اضافه کردین یا اینکه خودش بود ؟

----------


## noroozifar

من MVVM Light Toolkit V3  را نصب کردم یک پروژه باز کردم زدم new items  و بعد دیدم تو قسمت WPF هستش     شما تا چه اندازه تو مبحث WPF پیشرفت کرده اید ایا میتونید با بانک اطلاعاتی مخصوص entity framework کار کنید داخلش ... میتونید  binding را انجام بدید    طلاعات بین بانک داد و ستد کنید

----------


## m.bibjan

سلام این لینک رو ببینید به نظرم این مثال رو خوب متوجه بشیم مشکلمون توی این قضیه حله حداقل کار اینه که پایه رو یاد گرفتیم.
http://rongchaua.net/blog/c-mvvm-and-entity-framework/

یه نمونه برنامه هم خودش گذاشته ولی یه خطای میگیره من نفهمیدم چیکارش کنم.اگه فهمیدین بگین ، یاد بگیریم

----------


## noroozifar

مثالش کامل نیستش

دارم سعی میکنم این روش را اد بگیرم اما خیلی ها میگن از زمانش گذشته یعنی منسوخ شده است اگر هستش بهتره روش کار نکنیم ؟

وقت نظاریم روش ؟

به جای اون وقت روی یک تکنولوژی دیگه بزاریم حالا نمیدونم چی ؟

----------


## m.bibjan

> اما خیلی ها میگن از زمانش گذشته یعنی منسوخ شده است اگر هستش بهتره روش کار نکنیم ؟
> 
> وقت نظاریم روش ؟
> 
> به جای اون وقت روی یک تکنولوژی دیگه بزاریم حالا نمیدونم چی ؟


ببینید من 2 تا سوال دارم؟
1 - توی ایران منسوخ شده یا غیر از ایران ؟
2 - تکنولوژی بهتر ازینِ مایکروسافت واسه کار با دیتابیس چیه ؟(جنبه سوالی داره نه انکاری)
3 -

----------


## noroozifar

تو ایران من کسی نمیشناسم کلا با این wpf کار کنه    پس باید هم در اینجا هم در جهان منسوخ شده باشه احتمالا چون تاپیکش هم که خوابیده اما ویدئوهای که میبینم بیشضتر بر روی wcf و wpf با هم کار میکنند باز هم نمیدونم 

تکنولوژی کار با بانک الان به نظرم بهترینش  entity fream work ,  linq to sql هستش    بالاخر ادمهای که تجربه تو کار دارند باید بیاند ما را راهنمایی کنند که اونها هم هر گز به این تاپیکها سر نمیزنند  سر هم بزنند راهنمایی نمیکنند

----------


## d_derakhshani

> تو ایران من کسی نمیشناسم کلا با این wpf کار کنه    پس باید هم در اینجا هم در جهان منسوخ شده باشه احتمالا چون تاپیکش هم که خوابیده اما ویدئوهای که میبینم بیشضتر بر روی wcf و wpf با هم کار میکنند باز هم نمیدونم 
> 
> تکنولوژی کار با بانک الان به نظرم بهترینش  entity fream work ,  linq to sql هستش    بالاخر ادمهای که تجربه تو کار دارند باید بیاند ما را راهنمایی کنند که اونها هم هر گز به این تاپیکها سر نمیزنند  سر هم بزنند راهنمایی نمیکنند


آگه شما نمیشناسید دلیل نمیشه که نیست. من جز خودم شرکت های زیادی رو میشناسم که دارن با wpf برنامه هاشون رو تولید می کنن و بازار بسیار خوبی هم داره. مثل WPF وضعیت Silverlight هم همینطوره.
فقط من نمیدونم سطح این تالار چرا انقدر پایینه که آدم رغبت نمی کنه به سوالها جواب بده.
تو یکی از پست ها در تالار ASP.Net توضیح دادم فروم برای یادگیری از صفر نیست. برای رفع مشکله. اگه دوستانی که WPF کار می کنن برن یک کتاب بخونن(اونم کامل) و بعد بیان اگه مشکلی داشتن اینجا بیان کنن انقدر سطح این تالار یا تالار های مشابه پایین نمیاد.(البته اگه آموزشی هم تو تالار داده میشه کمتر کسی میره کامل بخونه تا خوب مسلط بشه و باز میان همون سوالها رو میپرسن)

----------


## sahebgharan

پترن MVVM پترن جدیدیه، فدیمی حرف عجیبیه!!!
پترن MVVM بعد از پترنای MVC (که می شه گفت بهترین پترن برای Web Developing هست) و MVP معرفی شده و مایکروسافت تو WPF از نسخه ی 3 دات نت فریم وورک داره پشتیبانی مناسبی ازش می کنه که با استفاده از قابلیت data binding واقعا کار باهاش بهتر و قابلیت گسترش پذیری برنامه ها رو به شدت افزایش داده.
Entity Framework هم یه ORM به حساب میاد که توسط مایکروسافت ارائه شده، کار باهاش خیلی ساده س و واسه پروژه های کوچیک خیلی مناسب تره. البته بهتره که وقتی با EF آشنا شدین سراغ NHibernate برین (البته نظر شخصیه منه، من هم با EF کار می کنم و هم Nhibernate که دوممی خیلی ترجیح می دم. به خاطر قابلیتای Mapping، بودن یا نبودن Lazy Loading، خوندن یا نوشتن گروهی، multi queries، کش و....)
واسه یاد گرفتن EF سایت MSDN Blog یه مثال راحت داره که بد نیس با اون شروع کنین، کتابم کم نیس راجبش
http://blogs.msdn.com/b/adonet/archi...lkthrough.aspx

----------


## sahebgharan

خیلی خوبه که وقتی با WPF کار می کنین برنامه تونو با پترن *MVVM* توسعه بدین ولی واسه شروع شما باید اول با مفهوم Binding تو این محیط آشناشین. مفهموم *Binding* و *DataContext* که همراه اونه رو یاد گرفتین تازه کار شروع می شه. کتابای WPF کلی درباره این مبحث توضیح دادن.
با WPF می تونین پترن MVC رم پیاده کنین چون وقتی binding یاد بگیرین دیگه این چیزا سخت نیست ولی برای WPF مناسب نیست (برعکس وب). پترن MVP خیلی شبیه MVVM هس اونجا Presenter هس اینجا ViewModel ولی ارتباط اینا با Veiw و نوعشون فرق داره! تو MVP مشکل tightly couple وجود داره (رابطه ی بیش اندازه ی کلاس ها با هم که فقط با کمک interfaceها می شه کاهشش داد. البته راه هایی مثل استفاده از DIها هم هس) ولی تو MVVm ما با کمک Databinding و commandها داده های کاربرو به ViewModel می دیم و Modelهاهم هیچ اطلاعی از ViewModelها ندارن
یا خودتون می خواین MVVM رو پیاده کنین که کار سختی نیس ولی درس نیس! یا از ابزارای آماده ای که داره گسترش پیدا می کنه باید استفاده کنین. به خاطر این می گم درس نیس که وقتی بعضیا دارن وقت می ذارن و هی باگارم برطرف می کنن چرا وقتتونو طلف کنین (البته برای استفاده از ااوناهم باید مفاهیم بدونین)
اگه با *Prism* آشناشین خیلی خوبه 
http://compositewpf.codeplex.com/
البته تست MVVM ین پروژهرو هم می تونین از اینجا دانلود کنین: (باید ویژوالتون 2010 باشه) http://visualstudiogallery.msdn.micr...7-8e8d57eb9942

*MVVM Foundation*
http://mvvmfoundation.codeplex.com/

*MVVM Light Toolkit*
http://mvvmlight.codeplex.com/

----------


## sasansara

من میدونم مشکل این دوستمون چیه. من خودم هم موقع یادگیری  سیلورلایت دچار این مساله بودم. بحث MVVM چون مفهومیه واقعا نیاز به درک عمیق تری داره. اما در بقیه مباحث چون روش مطرحه، بالاخره با sample مساله حل میشه. من خودم هم با اینکه آموزش های آقای نصیری در مورد MVVM رو خوندم که مفصل هم بود، واقعا واسم جا نیفتاد.مدت زیادی روی این مبحث وقت گذاشتم ولی... کتاب های دیگه هم که در حد معرفی و آشنایی گفتن. به همین دلیل نتونستیم تو پروژه ای که کار میکردم ازش استفاده کنم و دیگه هم فرصت پیگیری پیش نیومد.
در مورد منسوخ شدن هم ... تا جاییکه من میدونم بحث اصلی اینه که توی ویندوز 8 برنامه نویسی بر اساس دات نت نیست. به همین دلیل هم میگن که در آینده wpf جایی نداره. البته باید توجه داشت که روش کلی کار با  xaml که اساس طراحی در wpf هست همچنان در ویندوز 8 وجود داره.  
در مورد سیلورلایت هم چون اکثر مرورگرهای موبایل و تبلت  به خاطر حفظ باطری از افزونه ها ( مثل فلش و سیلورلایت)  پشتیبانی نمی کنند، این شایعه راه افتاده که نسخه 5 آخرین نسخه سیلورلایته. البته تا جایی که من میدونم خود مایکروسافت تا حالا این مورد رو تکذیب نکرده!! 

خلاصه اینجوری! :چشمک:

----------


## sahebgharan

واسه نوشتن یه برنامه ی ساده با کمک *MVVM* این مثال واقعا خوبه
https://rachel53461.wordpress.com/20...lemvvmexample/

----------


## sahebgharan

> من میدونم مشکل این دوستمون چیه. من خودم هم موقع یادگیری  سیلورلایت دچار این مساله بودم. بحث MVVM چون مفهومیه واقعا نیاز به درک عمیق تری داره. اما در بقیه مباحث چون روش مطرحه، بالاخره با sample مساله حل میشه. من خودم هم با اینکه آموزش های آقای نصیری در مورد MVVM رو خوندم که مفصل هم بود، واقعا واسم جا نیفتاد.مدت زیادی روی این مبحث وقت گذاشتم ولی... کتاب های دیگه هم که در حد معرفی و آشنایی گفتن. به همین دلیل نتونستیم تو پروژه ای که کار میکردم ازش استفاده کنم و دیگه هم فرصت پیگیری پیش نیومد.
> در مورد منسوخ شدن هم ... تا جاییکه من میدونم بحث اصلی اینه که توی ویندوز 8 برنامه نویسی بر اساس دات نت نیست. به همین دلیل هم میگن که در آینده wpf جایی نداره. البته باید توجه داشت که روش کلی کار با  xaml که اساس طراحی در wpf هست همچنان در ویندوز 8 وجود داره.  
> در مورد سیلورلایت هم چون اکثر مرورگرهای موبایل و تبلت  به خاطر حفظ باطری از افزونه ها ( مثل فلش و سیلورلایت)  پشتیبانی نمی کنند، این شایعه راه افتاده که نسخه 5 آخرین نسخه سیلورلایته. البته تا جایی که من میدونم خود مایکروسافت تا حالا این مورد رو تکذیب نکرده!! 
> 
> خلاصه اینجوری!


آره تا مفاهیم جا بیفته کار زیاد می بره :)
توی کنفرانس PDC 2010 یه حرفایی شد از مرگ سیلورلایت! این ترس برای فلش هم در فضای وب هس! وقتیم یه کمپانی مثل اپل از فلش و سیلورلایت پشتیبانی نمیکه خب ترسناکه! بازار HTML5 هم که داغه و همین HTML5 باعث این حرفاس به نظر من!
ولی WPF یه framework واقعا خوب برای توسعه ی نرم افزاره. قابلیت انعطاف بالا، استایل ها، انیمیشن (خود DirectX دیگه!)، commandها و ... و به نظر من بهترین framework واسه ی توسعه ی نرم افزارهای desktop. الان مایکروسافت کلی از نرم افزارهای کلیدی خودشو آورده رو WPF
Visual Studio
WebMatrix
و حتی Expression.
اینو بخونین به اون عکسم دقت کنین: http://www.zdnet.com/blog/microsoft/...r-future/10611

----------


## m.bibjan

سلام
من در حد آشنایی میدونم هر کدوم چه کاهایی میکنن ولی نمیتونم یه نرم افزار ساده بنویسم چون روند کار دستم نیومده چون تحقیق کردم ولی نمونه ننوشتم . چون تحقیقم منو راه ننداخته.اینجا میطلبه یکی بیاد ادم رو راه بندازه.همینطور بقیه دوستان.

باتوجه به اموزشهای موجود چه فارسی و چه انگلیسی که هر کدومشون مشکلات خودشون رو دارن و اون مشکلاتِ اموزشیها توی یادگیری MVVM در WPF کمک انچنانی نمیکنه به یه برنامه نویس (البته یه برنامه نویس نه من ).
به نظرتون بهتر نیست یکی از اقایونی که این مطلب واسش جا افتاده بیاد یه اموزش پروژه محور به بچه ها یاد بده.(البته مصور)
که توش چند تا مبحث لحاظ شده باشه 
1 - MVVM 
2 - Entity FramWork
بعدش با توجه استقبال بچه ها مبحث ORM رو اموزش داده بشه.

----------


## sahebgharan

سلام
این کاری که شما می گین خوبه ولی زمان گیره! الانم آموزشارو دیدین دیگه، یکی میاد از کتابا یا سایتا یه sample انتخاب می کنه بدون اینکه ذکر منبع کنه و در نظر بگیره که این sample واسه جا انداختن چه مطلبیه! به نام خودش یه چی می ده بیرون! اگه سایتاییم مثل Stack OverFlow دیده باشین می بینین بحث آموزش جایی مطرحه که تو کتابا خوب پرداخت نشده باشه و یا نمونه ی خوبی وجود نداشته باشه. کلا آموزش گذاشتن واقعا زمان بره.
الان شما با همون لیبکی که گذاشتم EF رو یاد بگیرین (تو محیط کنسول) که فک می کنم یه روز براش کافی باشه (البته اگه نیاز به کار با DB تو پروژه هاتون دارید!) شما اول این کار کنین بعد اگه جایی از کد یا مفهوم مشکل داشتین بپرسین شاید این قلق کد براتون غریب باشه:
var allFoods = from p in db.Products
                            where p.CategoryId == "FOOD"
                            orderby p.Name
                            select p;
یا شاید Data Annotations نشناسین، شما اون وخ بیا اینارو بپرس. بعد این که این روش یاد گرفتین خودم یه راه ساده تر کار با EF بهتون یاد می دم ولی این نیازه. باور کنین خودتونین که می تونین واسه خودتون کاری کنین درسته باید ذکات دانشو داد :) ولی واسه آموزش خیلی وخ باید کنار گذاشت. دوستان ایشالا ابن کارم می کنن.

----------


## sahebgharan

شما اول همین مثال ساده رو پیاده کنید که توش از هیچ ابزاری استفاده نشده (https://rachel53461.wordpress.com/20...lemvvmexample/) بعد اگه تونسین اجراش کنید ابزارای این کارو همین جا ادامه می دیم. این پروژه ام که فقط آموزشیو ساده س از ابزارا استفاده کرده (http://apuntanotas.codeplex.com)


بعدشم واسه شروع کارم پیشنهاد می کنم Visual Studio 2010 SP1 که آخرین نسخه ی کامل VS.
بعد *Nuget* رو نصب کنید (http://nuget.org/)
با کمک همون Nuget پکیچ MVVM Light نصب کنید.
این Nuget ربطی به برنامه ی WPF شما نداره یه ابزاره که به VS اضافه می شه و کار با ابزارای دیگه رو که به کار پروژه ی شما میادو راحت تر می کنه!

----------


## m.bibjan

> شما اول همین مثال ساده رو پیاده کنید که توش از هیچ ابزاری استفاده نشده (https://rachel53461.wordpress.com/20...lemvvmexample/)


ممنون 
این لینک خسته هستش.وارد سایت نمیشه.

انگار IP ایران رو ساپورت نمیکنه.V.P.N میخواد

----------


## sahebgharan

> ممنون 
> این لینک خسته هستش.وارد سایت نمیشه.
> 
> انگار IP ایران رو ساپورت نمیکنه.V.P.N میخواد


دامنه های وردپرس خیلی وقته فیل//ترن!

----------


## sahebgharan

من متن اون لینک اینجا می ذارم:
*A Simple MVVM Example*

In my opinion, if you are using WPF or Silverlight you should be using the MVVM design pattern. It is perfectly suited to the technology and allows you to keep your code clean and easy to maintain.

The problem is, there are a lot of online resources for MVVM, each with their own way of implementing the design pattern and it can be overwhelming. I would like to present MVVM in the simplest way possible using just the basics.

So lets start at the beginning.
*MVVM*

MVVM is short for Model-View-ViewModel.

Models are simple class objects that hold data. They should only contain properties and property validation. They are not responsible for getting data, saving data, click events, complex calculations, business rules, or any of that stuff.

Views are the UI used to display data. In most cases, they can be DataTemplates which is simply a template that tells the application how to display a class. It is OK to put code behind your view IF that code is related to the View only, such as setting focus or running animations.

ViewModels are where the magic happens. This is where the majority of your code-behind goes: data access, click events, complex calculations, business rules validation, etc. They are typically built to reflect a View. For example, if a View contains a ListBox of objects, a Selected object, and a Save button, the ViewModel will have an ObservableCollection ObectList, Model SelectedObject, and ICommand SaveCommand.

----------


## sahebgharan

*MVVM Example*
I’ve put together a small sample showing these 3 layers and how they relate to each other. You’ll notice that other than property/method names, none of the objects need to know anything about the others. Once the interfaces have been designed, each layer can be built completely independent of the others.
*Sample Model*
For this example I’ve used a Product Model. You’ll notice that the only thing this class contains is properties and change notification code.
Usually I would also implement IDataErrorInfo here for property validation, however I have left this out for now.
public class ProductModel : ObservableObject
{
    #region Fields

    private int _productId;
    private string _productName;
    private decimal _unitPrice;

    #endregion // Fields

    #region Properties

    public int ProductId
    {
        get { return _productId; }
        set
        {
            if (value != _productId)
            {
                _productId = value;
                OnPropertyChanged("ProductId");
            }
        }
    }

    public string ProductName
    {
        get { return _productName; }
        set
        {
            if (value != _productName)
            {
                _productName = value;
                OnPropertyChanged("ProductName");
            }
        }
    }

    public decimal UnitPrice
    {
        get { return _unitPrice; }
        set
        {
            if (value != _unitPrice)
            {
                _unitPrice = value;
                OnPropertyChanged("UnitPrice");
            }
        }
    }

    #endregion // Properties
}

----------


## sahebgharan

The class inherits from ObservableObject, which is a custom class I use to avoid having to rewrite the property change notification code repeatedly. I would actually recommend looking into Microsoft PRISM’s NotificationObject  or MVVM Light’s ViewModelBase which does the same thing once you are comfortable with MVVM, but for now I wanted to keep 3rd party libraries out of this and to show the code.public abstract class ObservableObject : INotifyPropertyChanged
{
    #region INotifyPropertyChanged Members

    /// <summary>
    /// Raises the PropertyChange event for the property specified
    /// </summary>
    /// <param name="propertyName">Property name to update. Is case-sensitive.</param>
    public virtual void RaisePropertyChanged(string propertyName)
    {
        this.VerifyPropertyName(propertyName);
        OnPropertyChanged(propertyName);
    }

    /// <summary>
    /// Raised when a property on this object has a new value.
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// Raises this object's PropertyChanged event.
    /// </summary>
    /// <param name="propertyName">The property that has a new value.</param>
    protected virtual void OnPropertyChanged(string propertyName)
    {
        this.VerifyPropertyName(propertyName);

        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }

    #endregion // INotifyPropertyChanged Members

    #region Debugging Aides

    /// <summary>
    /// Warns the developer if this object does not have
    /// a public property with the specified name. This
    /// method does not exist in a Release build.
    /// </summary>
    [Conditional("DEBUG")]
    [DebuggerStepThrough]
    public virtual void VerifyPropertyName(string propertyName)
    {
        // Verify that the property name matches a real,
        // public, instance property on this object.
        if (TypeDescriptor.GetProperties(this)[propertyName] == null)
        {
            string msg = "Invalid property name: " + propertyName;

            if (this.ThrowOnInvalidPropertyName)
                throw new Exception(msg);
            else
                Debug.Fail(msg);
        }
    }

    /// <summary>
    /// Returns whether an exception is thrown, or if a Debug.Fail() is used
    /// when an invalid property name is passed to the VerifyPropertyName method.
    /// The default value is false, but subclasses used by unit tests might
    /// override this property's getter to return true.
    /// </summary>
    protected virtual bool ThrowOnInvalidPropertyName { get; private set; }

    #endregion // Debugging Aides
}

----------


## sahebgharan

n addition to the INotifyPropertyChanged methods, there is also a debug method to validate the PropertyName. This is because the PropertyChange notification gets passed in as a String, and I have caught myself forgetting to change this string when I change the name of a Property.
Note: The PropertyChanged notification exists to alert the View that a value has changed so it knows to update. I have seen suggestions to drop it from the Model and to expose the Model’s properties to the View from the ViewModel instead of the Model, however I find in most cases this complicates things and requires extra coding. Exposing the Model to the View via the ViewModel is much simpler, although either method is valid.
*Sample ViewModel*
I am doing the ViewModel next because I need it before I can create the View. This should contain everything the User would need to interact with the page. Right now it contains 4 properties: a ProductModel, a GetProduct command, a SaveProduct command, an a ProductId used for looking up a product.public class ProductViewModel : ObservableObject
{
    #region Fields

    private int _productId;
    private ProductModel _currentProduct;
    private ICommand _getProductCommand;
    private ICommand _saveProductCommand;

    #endregion

    #region Public Properties/Commands

    public ProductModel CurrentProduct
    {
        get { return _currentProduct; }
        set
        {
            if (value != _currentProduct)
            {
                _currentProduct = value;
                OnPropertyChanged("CurrentProduct");
            }
        }
    }

    public ICommand SaveProductCommand
    {
        get
        {
            if (_saveProductCommand == null)
            {
                _saveProductCommand = new RelayCommand(
                    param => SaveProduct(),
                    param => (CurrentProduct != null)
                );
            }
            return _saveProductCommand;
        }
    }

    public ICommand GetProductCommand
    {
        get
        {
            if (_getProductCommand == null)
            {
                _getProductCommand = new RelayCommand(
                    param => GetProduct(),
                    param => ProductId > 0
                );
            }
            return _getProductCommand;
        }
    }

    public int ProductId
    {
        get { return _productId; }
        set
        {
            if (value != _productId)
            {
                _productId = value;
                OnPropertyChanged("ProductId");
            }
        }
    }

    #endregion

    #region Private Helpers

    private void GetProduct()
    {
        // You should get the product from the database
        // but for now we'll just return a new object
        ProductModel p = new ProductModel();
        p.ProductId = ProductId;
        p.ProductName = "Test Product";
        p.UnitPrice = 10.00;
        CurrentProduct = p;
    }

    private void SaveProduct()
    {
        // You would implement your Product save here
    }

    #endregion
}

----------


## sahebgharan

There is another new class here: the RelayCommand. This is essential for MVVM to work. It is a command that is meant to be executed by other classes to run code in this class by invoking delegates. Once again, I’d recommend checking out the MVVM Light Toolkit’s version of this command when you are more comfortable with MVVM, but I wanted to keep this simple so have included this code here./// <summary>
/// A command whose sole purpose is to relay its functionality to other
/// objects by invoking delegates. The default return value for the
/// CanExecute method is 'true'.
/// </summary>
public class RelayCommand : ICommand
{
    #region Fields

    readonly Action<object> _execute;
    readonly Predicate<object> _canExecute;

    #endregion // Fields

    #region Constructors

    /// <summary>
    /// Creates a new command that can always execute.
    /// </summary>
    /// <param name="execute">The execution logic.</param>
    public RelayCommand(Action<object> execute)
        : this(execute, null)
    {
    }

    /// <summary>
    /// Creates a new command.
    /// </summary>
    /// <param name="execute">The execution logic.</param>
    /// <param name="canExecute">The execution status logic.</param>
    public RelayCommand(Action<object> execute, Predicate<object> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");

        _execute = execute;
        _canExecute = canExecute;
    }

    #endregion // Constructors

    #region ICommand Members

    [DebuggerStepThrough]
    public bool CanExecute(object parameters)
    {
        return _canExecute == null ? true : _canExecute(parameters);
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public void Execute(object parameters)
    {
        _execute(parameters);
    }

    #endregion // ICommand Members
}

----------


## sahebgharan

*Sample View*
And now the Views. These are DataTemplates which define how a class should be displayed to the User. There are many ways to add these templates to your application, but the simplest way is to just add them to the startup window’s Resources.<Window.Resources>
    <DataTemplate DataType="{x:Type local:ProductModel}">
        <Border BorderBrush="Black" BorderThickness="1" Padding="20">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition />
                    <RowDefinition />
                    <RowDefinition />
                </Grid.RowDefinitions>

                <TextBlock Grid.Column="0" Grid.Row="0"  Text="ID" VerticalAlignment="Center" />
                <TextBox Grid.Row="0" Grid.Column="1"  Text="{Binding ProductId}" />

                <TextBlock Grid.Column="0" Grid.Row="1"  Text="Name" VerticalAlignment="Center" />
                <TextBox Grid.Row="1" Grid.Column="1"  Text="{Binding ProductName}" />

                <TextBlock Grid.Column="0" Grid.Row="2"  Text="Unit Price" VerticalAlignment="Center" />
                <TextBox Grid.Row="2" Grid.Column="1"  Text="{Binding UnitPrice}" />

            </Grid>
        </Border>
    </DataTemplate>

    <DataTemplate DataType="{x:Type local:ProductViewModel}">
        <DockPanel Margin="20">
            <DockPanel DockPanel.Dock="Top">
                <TextBlock Margin="10,2" DockPanel.Dock="Left" Text="Enter Product Id" VerticalAlignment="Center" />

                <TextBox Margin="10,2" Width="50" VerticalAlignment="Center" Text="{Binding Path=ProductId, UpdateSourceTrigger=PropertyChanged}" />

                <Button Content="Save Product" DockPanel.Dock="Right" Margin="10,2" VerticalAlignment="Center"
                        Command="{Binding Path=SaveProductCommand}" Width="100" />

                <Button Content="Get Product" DockPanel.Dock="Right" Margin="10,2" VerticalAlignment="Center"
                        Command="{Binding Path=GetProductCommand}" IsDefault="True" Width="100" />
            </DockPanel>

            <ContentControl Margin="20,10" Content="{Binding Path=CurrentProduct}" />
        </DockPanel>
    </DataTemplate>
</Window.Resources>

The View defines two DataTemplates: one for the ProductModel, and one for the ProductViewModel. You’ll need to add a namespace reference  to the Window definition pointing to your Views/ViewModels so you can define the DataTypes. Each DataTemplate only binds to properties belonging to the class it is made for.
In the ViewModel template, there is a ContentControl that is bound to ProductViewModel.CurrentProduct. When this control tries to display the CurrentProduct, it will use the ProductModel DataTemplate.

----------


## sahebgharan

*Starting the Sample*
And finally, to start the application add the following on startup:MainWindow app = new MainWindow();
ProductViewModel viewModel = new ProductViewModel();
app.DataContext = viewModel;
app.Show();
This is found in the code behind the startup file – usually App.xaml.cs.
This creates your Window (the one with the DataTemplates defined in Window.Resources), creates a ViewModel, and it sets the Window’s DataContext to the ViewModel.
And there you have it. A basic look at MVVM.
UPDATE
Sample code can be found here.
*Notes*
There are many other ways to do the things shown here, but I wanted to give you a good starting point before you start diving into the confusing world of MVVM.
The important thing to remember about using MVVM is your Forms, Pages, Buttons, TextBoxes, etc (the Views) are NOT your application. Your ViewModels are. The Views are merely a user-friendly way to interact with your ViewModels.
So if you want to change pages, you should not be changing pages in the View, but instead you should be setting something like the AppViewModel.CurrentPage = YourPageViewModel. If you want to run a Save method, you don’t put that behind a button’s Click event, but rather bind the Button.Command to a ViewModel’s ICommand property.
I started with  Josh Smith’s article on MVVM, which was a good read but for a beginner like me, some of these concepts flew right over my head.
I’ve never done a blog or tutorial before, but I noticed there is a lot of confusion about what MVVM is and how to use it. Since I struggled through the maze of material online to figure out what MVVM is and how its used, I thought I’d try and write a simpler explanation. I hope this clarifies things a bit and doesn’t make it worse

----------


## sahebgharan

لینک دانلود سورس کد: http://www.mediafire.com/?2a8gwjtq58hsj86
Developer's Guide to Microsoft Prism: http://msdn.microsoft.com/en-us/library/gg406140.aspx
MVVM Light Toolkit: http://mvvmlight.codeplex.com/
Josh Smith’s article on MVVM: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

----------


## سوداگر

دوست عزیز، رغبت نیست که آموزشهای فارسی رو یاد بگیرن اونوقت...! برای آموزش انگلیسی توی سایت codeproject کلمه MVVM رو جستجو کنید تا مقالات تصویری از در و دیوار شروع به باریدن بکنه!

----------


## noroozifar

دست این دوستمون که داره زحمت میکشه درد نکنه  اقا اگر کسی کامل متوجه شد یک مثال کامل سورس با اموزش بزار تا ما هم بفهمیمش   از صفر تا پیاز داغش می خواهم یک برنامه تقریبا شبیه به حسابداری با هاش بنویسم    میترسم توش گیر کنم

----------


## sahebgharan

> دوست عزیز، رغبت نیست که آموزشهای فارسی رو یاد بگیرن اونوقت...! برای آموزش انگلیسی توی سایت codeproject کلمه MVVM رو جستجو کنید تا مقالات تصویری از در و دیوار شروع به باریدن بکنه!


ایشالا همین نمونه رو پیاده کنن و ترسشون از سرچ تو CodeProject و Stack بریزه. ;)
به بحثم اینه که منابع فارسی ما خیلی محدوده -تو هر زمینه ای- و باید از این حالت بیاد بیرون!

----------


## sahebgharan

> دست این دوستمون که داره زحمت میکشه درد نکنه  اقا اگر کسی کامل متوجه شد یک مثال کامل سورس با اموزش بزار تا ما هم بفهمیمش   از صفر تا پیاز داغش می خواهم یک برنامه تقریبا شبیه به حسابداری با هاش بنویسم    میترسم توش گیر کنم


شما سورس همین پروژه رو دانلود کنید و بعد با F10 اجراش کنین، اجرای خط به خط! باور کنید خیلی به فراگیریش کمک می کنه! جاییم سوال هس خیلیا می تونن راهنمایی تون کنن

----------


## m.bibjan

سلام 
توی این تاپیک به نتیجه ایی نرسیدم.کسی نیست بگه این پترن اصلی MVVM چیه؟من هر چی پترن MVVM گیر میارم این سه فولدر Model-Viwe-ViweModelرو توی قسمت Solution نمیبینم.
نکنه توی ویژوال 2010 اینطوری شده؟

----------


## noroozifar

درک این mvvm برای من خیلی سخت بود رفتم سراغ  asp.net یاد بگیرم بازار کار خوبی داره

----------


## m.bibjan

سلام یعنی شما بی خیال این 5 سال کار با سی شارپ شدین؟

----------

