# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > WPF >  بحث و تبادل نظر در مورد MVVM Pattern در Wpf Programming

## Somayeh_Zamani

سلام دوستان
راستش من قسمت نظر و پیشنهاد رو دیدم، و به نظرم نظر و پیشنهاد الکی چیزی از پیش نمی بره بدون عمل! 
خیلی دوست داشتم که دوستان اگر در مورد الگوی mvvm (که برنامه نویسان Wpf از این الگو پیروی می کنند)مطالعه ای داشته اند، اطلاعات خودشون رو در اختیار بقیه هم قرار بدن.
اگر کسی چیزی بلده استارت بزنه و الا که خودم استارت می زنم :لبخند:

----------


## رضا عربلو

می تونه بحث بسیار مفیدی بشه. امیدوارم که تمامی دوستان در اون شرکت کنند و به موضوع های انحرافی نپردازند.
(این نقطه شروع خوبی نیست ولی برای دلگرمی شما و دیگر دوستان ترجیح دادم بیاورم تا دوستان علاقه مند به شرکت در بحث بشوند.)
چیزیکه دست آخ در Model-View-ViewModel pattern به آن می رسیم فریم ورک هایی که آن را پیاده سازی می کنند . (منبع : http://www.japf.fr/2009/10/a-quick-t...vvm-frameworks)


Cinch
MVVM Light Toolkit 
MVVM Helpers
MVVM Foundation
Caliburn
Onyx
Calcium
nRoute
Nito MVVM
Ocean
Basic MVVM framework
GoodLight

----------


## Somayeh_Zamani

پس من شروع به معرفی این Pattern می کنم امیدوارم که این تاپیک به تاپیک پربار و مفیدی تبدیل شود. اما از همه دوستان خواهش می کنم که: 1. لطفا از پرداختن به موضوعات انحرافی خودداری کنید و به جای این کار تاپیک جداگانه بزنید، در غیر اینصورت پست شما توسط مدیران، حذف خواهد شد.

 2. این تاپیک یک تاپیک آموزشی به این صورت که یک نفر آموزش بدهد و بقیه نگاه کنند نیست! بلکه همان طور که از اسم آن مشخص است، بحث و تبادل نظر هست. می خواستم از دوستانی که تجربه یا نظری دارند، خواهش کنم که در جهت پربار شدن تاپیک، همراهی کنند.

 3. همچنین از مدیران محترم تالار، تقاضا دارم که در جهت بهبود این تاپیک همکاری کنند.

 4. بعضی از مباحث، پیش نیاز محسوب می شوند مثلا اینکه اصلا Pattern چی هست؟ و یا بحث  Routed Events and  commands، Bindig، Templates. که  نظر من اینست که یا یک تاپیک جداگانه برای پرداختن به این مباحث بزنیم و یا لینکی می ذاریم که دوستان به آن لینک مراجعه کنند و یا به فلان مبحث که در فلان کتاب خوب به آن پرداخته شده است، ارجاع می دهیم.

 5. هر کسی، اگر نمونه کد مفیدی دارد، می توان با قرار دادن کد در اینجا، در شناساندن بهتر این Pattern ، کمکی کرده باشد.
_
" پیشاپیش از همکاری و توجه شما سپاسگزارم "
SoZa
_

----------


## Somayeh_Zamani

Patterns، به بیان ساده؛ یعنی استفاده از Solutionهای ارائه شده برای یک مسئله خاص، در حل مسائل مشابه. به عبارت دیگر با استفاده از Design Patterns، می توانیم به استفاده مجدد از تجربه برسیم (Experience Reuse). 
 دوستان توجه داشته باشند که قبلا یک تاپیک هم با عنوان Design Pattern، در همین سایت، ساخته شده بوده.
http://www.barnamenevis.org/sh...ad.php?t=99235

 همراه با تکنولوژی Wpf مایکروسافت، یک Pattern جدید به نام  MVVM) Model-View-ViewModel)، متولد شد. این Pattern، ترکیبی از همان Patternهای قدیمی MVC و MVPهست. 
 چرا یک Pattern جدید ارائه شد؟ (این Pattern از قبل ارائه شده بود و این تکنولوژی Wpf بود که با هدف کار با این Pattern،  توسط مایکروسافت ارائه شد. و اصلا مایکروسافت  Wpfرو برای  اجرای MVVMعرضه کرد.)

   1. اول از همه، تکنولوژی Wpf، نوعی از تکنولوژی رو به ما ارائه کرده که به طور کامل می تونه نگرش ما رو نسبت به طراحی و کد تغییر بده. با پیروی از MVVM Pattern که در خورِ این تکنولوژی است، ما می توانیم کاملا به طراحی UI بپردازیم، در حالی که این لایه، هیچ چیز راجع به لایه Model نداند. 
   2. نکته دوم، استفاده مجدد هست. مثلا ما به راحتی می توانیم یک Wpf Application رو به یک Silverlight app تبدیل کنیم.

 *Model:* هر کسی  که از قبل بر روی Applicationهای چند لایه کار کرده، می دونه که Model چیه؟ مدل، گروه  entityهای موجودِ برنامه است. من این لایه رو معمولا با Linq2Sql یا Entity framework مایکروسافت ایجاد می کنم. شما چطور؟ 

 *View:* همان کدهای XAML گرافیکی است که برای تولید UI استفاده می شود و هیچ چیز بیش از آن نیست. (طراحی User Interface یک Application حرفه ای اصلا کار ساده ای نیست. اینکه در نظر بگیریم، UI قراره یک سیستم اساسی رو نمایش بده و در عین حال، نیازهای سلیقه ای و پیش بینی نشده ی کاربرانش رو ارضا کنه، می تونه باعث بشه که  UI، تبدیل به فرارترین ناحیه ی بیشتر Applicationها بشه.)

 *ViewModel:* بر خلاف Presenter در MVP Pattern، یک ViewModel، به هیچ Referenceی به View، نیاز ندارد. View به Propertyهای موجود در ViewModel، بایند می شود. که این Propertyها، همان Propertyهایی هستند که دیتاهای مربوط به آبجکت های لایه Model رو ارائه می دهند. بایندیگ ها بین  Viewو ViewModel راحت انجام می شود. یک آبجکتِ ViewModel، به عنوان DataContext یک Set ، View می شود. اگر مقادیرِ Propertyها در ViewModel، تغییری کنه، مقادیر جدید، از طریق Data  Binding به صورت خودکار به View اعمال می شه.
 زمانی که  کاربر، بر روی یک Button در View،  کلیک می کند، یک Command موجود در ViewModel، به منظور انجام عمل درخواست شده، اجرا می شود.
   ViewModel (نه View!)، همه تغییراتی که می خواهیم تو دیتاهای لایه Model بدهیم، اعمال می کند. کلاس های View، اصلا نمی دانند که کلاس های Model، وجود دارند یا نه! این در حالی است که ViewModel و Model هم از View، هیچ خبری ندارند. و در واقع، Model به طور کامل، نسبت به وجود یا عدم وجودِ Viewو ViewModel، بی اطلاع است. (هر لایه ای فقط لایه ی یه دونه پایین تر رو می شناسه تا می رسیم به Model، که فقط خودشو می شناسه!)

*Great*! این یعنی یک طراحی بسیار Loosely Coupled) .Loosely Coupled یک اصطلاح متداول در برنامه نویسی است؛ بدین معنا که یک زوج لایه یا یک کوپل لایه، دارای وابستگی و درهم تنیدگی سستی باشند. یعنی در واقع از هم مستقل بوده و جدا کردن این دو لایه از هم، هیچ مشکلی برای دیگری بوجود نیاورد. )

_
" اگر فونتش یه کم بد شده بود، عذر می خوام چون تو Word، تایپ کرده بودم و بعد کپی کردم. "_
_SoZa_

----------


## mdssoft

بحث بسیار عالی هست و من هم خیلی علاقه مندم.
این 2 reference هست که من کمی اونا رو مطالعه کردم ، اما راسیتش چیزه زیادی دستگیرم نشد  :افسرده: 

http://www.codeproject.com/KB/WPF/Tr...ViewModel.aspx
http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

این هم یه فیلم آموزشی در رابطه با MVVM :

http://blog.lab49.com/archives/2650
http://blog.lab49.com/archives/2689

خودم دارم فیلم رو میبینم. خیلی بهتر از مقاله هست.

----------


## majid325

عنوان تاپیک هم گرم هست و هم قابل بحث.
این روزهای وقت زیادی ندارم ولی سعی میکنم این تاپیک رو دنبال کنم , دیدم تاپیک یه خورده سرد شده گفتم یه نمونه کد ساده که دوستان تازه کار هم زیاد تو پیچ و تابش سر در گم نشن بزارم شاید اشتیاق دوستان به ادامه بحث بیشتر بشه.
البته سعی میکنم همین نمونه رو یواش یواش کاملش کنم.
*
پست های بی محتوا حذف میشوند*




> من این لایه رو معمولا با Linq2Sql یا Entity framework مایکروسافت ایجاد می کنم. شما چطور؟


بهترین انتخاب همون orm هست.
البته این روزها شرکت های بزرگ برای خودشون یه orMap بهنیه شده مینویسند .




> View: همان کدهای XAML گرافیکی است که برای تولید UI استفاده می شود و هیچ چیز بیش از آن نیست.


البته نه به این صراحت.

----------


## Amir Oveisi

یه نمونه برنامه ساده و تقریبا کامل با  MVVM و Entity Framework برای کار با دیتابیس نوشتم که امیدوارم با بحث روش، یخ اینجا آب شه و تاپیک به زندگی برگرده! (زهی خیال باطل :دی )

https://barnamenevis.org/showpo...62&postcount=5

----------


## happy65_sh

سلام آقاي اويسي واقعا دستتون درد نكنه نمونه ي كامل و جالبي بود  :تشویق: 
فقط يه سوالي اگه نخواهيم بعد از اضافه شدن مقادير جديد enable باتن اضافه فرق كنه و بازهم كاربر بتونه يه employee جديد ثبت كنه(بدون خارج شدن از برنامه)بايد چيكار كنيم؟
يه سوال ديگه اگه بخواهم با تغيير رديف در ديتاگريم مقادير textbox ها هم عوض بشه بايد چيكار كرد؟؟
ممنون ميشم راهنماييم كنيد تا مشكلم حل بشه اگه نياز شد كدم را هم ميتونم بذارم.
بازم تشكر

----------


## Amir Oveisi

سلام، خواهش می کنم
اگر دقت کرده باشید، برای هر command دو تا event هندل شده:
command_canExecutecommand_execute

execute که مشخصه چی کار میکنه، کارهای لازم برای اجرا شدن command رو انجام میده. مثل عمل insert برای command مربوطه.
canExecute تو command ها مشخص کننده اینه که این command در چه شرایطی قابلیت اجرا داشته باشه. مثلا insertCommand رو در نظر بگیرید، ما میخوایم که یک employee جدید اضافه کنیم با id = 2. این کار زمانی امکان پذیر خواهد بود که employee دیگه ای با id = 2 در table ما نباشه قبلا. پس اومدیم و در canExecute این قضیه رو چک کردیم و اگر employee با اون id نبود، true برمیگردونیم و اگر هم employee با اون id قبلا بوده false برمیگردونیم.
حالا این که چرا button مربوط به insert بعد از عمل insert غیر فعال میشه اینه:
    چون مقدار textbox مربوط به id دارای یه مقداری هست که یک employee با اون id الان تو table وجود داره پس عملا نمیشه چنین employee رو دوباره ایجاد کرد و واسه همین button مربوط به insert غیرفعال میشه
برای اضافه کردن یک employee جدید هم نیازی نیست دوباره برنامه رو run کنید، بلکه کافیه یک مقدار جدید به id در textbox وارد کنید و خواهید دید که insert فعال میشه!

برای button های update و Delete هم همچین قضیه ای وجود داره و زمانی فعال خواهند بود که یک employee در table، با مقداری که برای id در Textbox نوشته شده، وجود داشته باشه. فرض کنید شما میخواین یک employee با id = 3 رو delete کنید. برای این کار در Textbox مربوط به id مقدار 3 رو وارد می کنید. زمانی که فوکوس از اون textbox خارج میشه،canExecute برای deleteCommand اجرا میشه و اگر employee با اون id وجود داشته باشه، button مربوط به delete فعال میشه و در  غیر اینصورت غیر فعال میشه.
برای update هم مثل delete هست.

باز هم سوالی بود مطرح کنید.
موفق باشید

----------


## happy65_sh

سلام و ممنون از اينكه وقت گذاشتيد



> يه سوال ديگه اگه بخواهم با تغيير رديف در ديتاگريم مقادير textbox ها هم عوض بشه بايد چيكار كرد؟؟


من براي اينكار datacontex اون stackpanel ي كه text box ها داخلش بود و itemssource ديتا گريدم را يك چيز گذاشتم در واقع به جاي observablecollection از يك collectionViewSource استفاده كرده ام آيا اين روش درسته؟ 
در اين كه هر دو بايد از يك منبع داده بگيرند شكي نيست اما براي استفاده هاي بعدي استفاده از كدوم(collectionviewsource يا observableCollection) بهتره؟ اصلا تفاوتي داره؟
و اينكه اگر كاربر بخواد مقداري كه توي textbox نشون داده ميشه را حذف كنه بدون اينكه مجبور باشه دستي چيزي را توي تكست باكس ID بنويسه بايد چه چيزي را به command پاس بدم چون وقتي newEmployee را پاس ميدهم پيغام خطا ظاهر ميشه:



> sequence contains no element


<<<<< :گیج: اميدوارم سوالاتم زياد خنده دار نباشه  :لبخند گشاده!: اگرهم هست به بزرگي خودتون و تازه كار بودن من ببخشيد>>>>>>>

----------


## delasa

آموزش MVVM که شامل 5 قسمت است به همراه مثال 

این لینک قسمت اول 
http://vahidnasiri.blogspot.com/2010/04/m-v-vm.html

بقیه قسمت ها در همین وبلاگ موجود است

----------


## davoodrm666_666

آموزش آقاي وحيد نصيري هم براي شروع مناسبه http://vahidnasiri.blogspot.com/search/label/MVVM

----------


## مهدی فرزاد

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

----------


## davoodrm666_666

تو سايت windowsclient هم يه Video خيلي خوب با موضوع Data-driven  پيدا كردم. http://windowsclient.net/learn/video.aspx?v=314683

----------


## reza105

> البته این روزها شرکت های بزرگ برای خودشون یه orMap بهنیه شده مینویسند .


ميتونيد بيشتر توضيح بديد؟

----------


## davoodrm666_666

يعني هرشركتي براي خودش يك framework مي نويسه كه يكي از وظايف framework ايجاد لايه ارتباط با ديتابيس هستش و معني oram يا Object relation Mapping هم اينه كه شما مي ياييد DataBase رو به صورت Object مي بينيد و باهشان به صورت ابجكتي كار مي كنيد كه از framework هايي كه اين كار رو انجام مي دهند Linq to Sql - entity framework - Plinqo و ... هستند

----------


## Somayeh_Zamani

> عنوان تاپیک هم گرم هست و هم قابل بحث.
> این روزهای وقت زیادی ندارم ولی سعی میکنم این تاپیک رو دنبال کنم , دیدم  تاپیک یه خورده سرد شده گفتم یه نمونه کد ساده که دوستان تازه کار هم زیاد  تو پیچ و تابش سر در گم نشن بزارم شاید اشتیاق دوستان به ادامه بحث بیشتر  بشه.
> البته سعی میکنم همین نمونه رو یواش یواش کاملش کنم.
> 
> پست های بی محتوا حذف میشوند
> 
>  نوشته شده توسط Somayeh_Zamani                      
>                  من این لایه رو معمولا با Linq2Sql یا Entity framework مایکروسافت ایجاد می کنم. شما چطور؟
> 
> ...



@*majid325:*
چرا نه به این صراحت؟!

----------


## aghayex

من همیشه چیزایی رو که می خوام یاد بگیرم دنبال منابعی می گردم که اونا رو به زبان ساده بیان کنه ( در حد ابتدای ) اما این بحت رو هر چی دنبالش بودم که یه منبع خوب پیدا کنم پیدا نکردم و فقط شد اون منبع آقای نصیری که اونم مثال های نامفهوم بود .
حالا علت اینکه این بحث MVVM برا من جانیوفتاده رو در موارد زیر می بینم
1 - این بحث شامل مباحث کلاس ، بایندینگ هست که در این دو بحث من ضعیفم
2 - عدم وجود منبع روان به صورت کار عملی
حالا از دوستان این دخواست رو دارم که اگه این توانایی رو دارن همراهی کنن

----------


## PetekDincos

با سلام
من جدیدا می خوام این الگو رو یاد بگیرم سوال اولم در مورد اینکه کدامیک از Framework های این الگو از بقیه بهتره و سوال دوم در مورد اینکه این الگو تقریبا 30 درصد سرعت برنامه رو افزایش می ده آیا صحت داره و چگونه این کار رو انجام می ده با تشکر

----------


## PetekDincos

با سلام
کسی که به این سوال ما جواب نداد  با خوندن مطالب آقای وحید نصیری فهمیدم که Light Toolkit از بقیه بهتره و یه سوال دیگه داشتم اونم اینه مثلا برای پاسخ به رویداد GotFocus یک TextBox ای که در یک View قرار دارد در کد Xaml این View تکست باکس و با رویدادش به این صورت می نویسند

<TextBox Name="txt1" Text="Hello" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="GotFocus" >
<cmd:EventToCommand Command="{Binding GotFocusCommand}" PassEventArgsToCommand="True" MustToggleIsEnabledValue="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>

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

----------


## davoodrm666_666

> با سلام
> کسی که به این سوال ما جواب نداد با خوندن مطالب آقای وحید نصیری فهمیدم که Light Toolkit از بقیه بهتره و یه سوال دیگه داشتم اونم اینه مثلا برای پاسخ به رویداد GotFocus یک TextBox ای که در یک View قرار دارد در کد Xaml این View تکست باکس و با رویدادش به این صورت می نویسند
> 
> <TextBox Name="txt1" Text="Hello" >
> <i:Interaction.Triggers>
> <i:EventTrigger EventName="GotFocus" >
> <cmd:EventToCommand Command="{Binding GotFocusCommand}" PassEventArgsToCommand="True" MustToggleIsEnabledValue="True" />
> </i:EventTrigger>
> </i:Interaction.Triggers>
> ...


كافيه كه يك EventTrigger ديگه در قسمتInteraction.Triggers بنويسيد


<TextBox Name="txt1" Text="Hello" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="GotFocus" >
<cmd:EventToCommand Command="{Binding GotFocusCommand}" PassEventArgsToCommand="True" MustToggleIsEnabledValue="True" />
</i:EventTrigger>
 

<i:EventTrigger EventName="Click" >
<cmd:EventToCommand Command="{Binding ClickCommand}" PassEventArgsToCommand="True" MustToggleIsEnabledValue="True" />
</i:EventTrigger>

</i:Interaction.Triggers>
</TextBox>

----------


## PetekDincos

با سلام
 مثلا 20 تا تکست باکس تو یه View وجود داره آیا باید برای این 20 تا تکست باکس همین کار ها رو تکرار کرد یه راهی وجود نداره که تکرار انجام نشه با تشکر

----------


## Hamishebahar

سلام بحث mvvm بحث شیرینیه...
دوست دارم ادامه بدید.



> چرا نه به این صراحت؟!


من توی آموزش های آقای نصیری دیدم که یه سری کدها رو میشد توی قسمت Design هم نوشت(قبل از InitializeComponent).

----------


## davoodrm666_666

> با سلام
> مثلا 20 تا تکست باکس تو یه View وجود داره آیا باید برای این 20 تا تکست باکس همین کار ها رو تکرار کرد یه راهی وجود نداره که تکرار انجام نشه با تشکر


بله در حالت استاندارد بايد اين كار رو انجام داد البته مي شه با كمي خلاقيت اين رو هم بهتر نوشت

----------


## farashah_jalal

با سلام 
امیدوارم این بحث ادامه پیدا کند و من هم به تونم توی این بحث ها سهمی داشته باشم .
یک پروژه کوچکی را با mvvm و entitiy fram work نوشتم که در خدمت دوستان قرار می دم.
در این نمونه از linq to entity استفاده شده است. و در بعضی از مواقع هم از sp استفاده شده است.
اگر سوالی چیزی باشه در خدمتم . موفق باشید .سال نو مبارک :چشمک:  :لبخند: 
mvvmpoyan.rar

----------


## iranian_genius

lمباحث این تاپیک بسیار بسیار مفید هست وحیفه این همه مدت بدون پست مونده ...

لطفا صاحب نظران به اراءه مثال راجع به معماری MVVM  و توضیح کامل اون و همچنین سایر Pattern های مطرح تو زمینه WPF بپردازند...

----------


## farashah_jalal

با سلام 
در این تایپک برای شروع و کار با یان معماری  بحث های مفیدی شده است و برای شروع می تونید از اونها استفاده کنید .
و اگر سوال و یا مشکلی بود می تونید مطرح کنید تا راهنمایتون کنیم.
با تشکر

----------


## mhs5862

انگار source تون ناقصه چون فایل sln رو تداره و از قسمت file/open/project هم کردم یه عالمه خطا داد

----------


## saraparsa

سلام به همه دوستان و ممنون به خاطر این مبحث مهم و جدید
راستش من تو شرکتی کار میکنم که ازیک فریم ورک که خریداری کرده اند استفاده میکنند که از تکنولوژی wpf,mvvm استفاده میکنند
من چندتا مشکل دارم یکی بایند کردن کمبوباکسهایی که به صورت دستی پر میشوند
دوم بایند کردن لوک آپها
تو این اواخر هم یک usercontrol نوشتم که نمیدونم چطور داخلش از لایه دیتااکسس استفاده کنم آیا درست استفاده کردنش تو این قسمت?
و اینکه نمی دونم این usercontrol از چه کلاسی ارث بری کنه چون فرزند نیست و خودش حکم یه فرم رو داره?
ایکاش اینجا بیشتر در مورد codbehind صحبت شه

----------


## Amir Oveisi

خوب تا کسی ندونه از چه framework ای استفاده میکنید نمیتونه راهنماییتون کنه :)

----------


## saraparsa

rastesh frameworkeshon khase khodeshone

----------


## saraparsa

به هرحال من نحوه استفاده درست و ساخت یک usercontrol را نمی تونید همراه با یک sample برام توضیح بدین؟

----------


## morteza_2009

سلام خدمت دوستان عزیز 

من تازه شروع کردم به یادگیری MVVM و دارم همراه یادگیری یکی از پروژه هام رو بر طبق اون انجام میدم ... حالا تو بعضی تعاریف مشکل دارم و بعضی جاها هم تو پیاده سازی ... میپرسم امیدوارم که دوستان مطلع بدادمون برسن ...

تو بخش تعاریف :

1. فرض در طراحی اومدن یه کلاس رو معرفی کردن به نام person با خواص خودش ( firstname , birthday , ..) و گفتن این کلاس متدی داره که مثلا میاد یه محاسبه ای در مورد روز تولد طرف میکنه (() public Boolean CheckBirthDay ) و یه مقدار bool رو بر میگردونه ... 

پر واضحه که این طراحی یه دیتابیس رو هم شامل میشه که توش جدول person هم داریم  .... میایم تو MVVM : فرض view  یه دیتا گرید ساده است ... viewmodel  هم با observablecollection و لایه DAL اومده از کلاس model استفاده کرده و اطلاعات نمایشی رو برای view ردیف کرده ... حالا سوال اینه ... اینا همش برای نمایش اون چیزی هست که مستقیم از دیتابیس میاد ... من دقیقا کجا باید اون محاسبات روی روز تولد کلاس person رو انجام بدم ( که بعد بیام نتیجه bool رو تو view نمایش بدم ؟)؟ ... viewmodel ? ... یا Model ?  ... یا اصلا تو یه کلاس جدا ؟ ... این احتمالا همون بخش BLL برنامه است ... تو MVVM این بخش رو کجا قرار میدیم ؟ توضیحات اینترنتی میگه بزارش تو  model ... ولی همیشه اموزش ها model رو خیلی ساده با چند تا متغییر تعریف میکنه ! ... متدی اصلا توش نداریم ! ... این یه مثال ساده بود ... فرض متد هایی داریم که خودشون اندازه یه کلاس محاسبات داره ... آیا اونا رو هم باید بزاریم تو Model یا جایی دیگه ؟ ... 

public class Model: 
    {
        public string FirstName{ get; set; }
        public string LastName{ get; set; }
    }

2. هر برنامه ای که با دیتابیس کار میکنه باید بتونه یه کلاس اماده کنه برای CRUD با دیتابیس ... تو بعضی اموزش ها بهش میگن Data Access Layer و بعضی جاها Repository .... یا شایدم من درست فکر نمی کنم ... ولی کار این دو تا دقیقا همینه ... حالا این لایه رو وقتی ایجاد کردیم کجای معماری قرار میگیره ... یعنی همونطور که model نباید از viewmodel خبر داشته باشه و viewmodel از view ... الان این لایه دقیقا چطوره ؟ ... ایا میشه ازش تو viewmodel  هم استفاده کرد ؟ ... یه جا میگن باید viewmodel با مدل در ارتباط باشه بعد model بیاد با DAL در ارتباط باشه ... یه جایی دیگه خودشون میان برای پرکردن observablecollection مستقیما داخل viewmodel از DAL استفاده میکنن !!! 

تو بخش پیاده سازی :
1. ( شبیه سوال اخر بخش تعاریف ) وقتی یه کلاس model داریم ... چطوری باید تو viewmodel یک observablecollection رو از اطلاعات دیتابیس پر کنیم ؟ ... مستقیم بری از LoadData مثلا تو DAL استفاده کنیم یا یه کلاس که اینجوری معرفی شده :

public Class Models : ObservableCollection<Model> 

که بعد تو این کلاس بیایم از لایه دسترسی استفاده کنیم ؟ ... میدونم هر دو نوعش میشه ولی کدومش مناسبتره ... کدومش باعث میشه مقصود اصلی MVVM که جداسازی لایه ها از هم و اجرای unittest رو هر کدومشون بهتر اجرا بشه ؟

2. برای استفاده از فیلتر کردن اطلاعات میاد میگه اینجوری کنین :

<Window.Resources>
   ...
   <CollectionViewSource Source="{Binding Things}" x:Key="X_CVS"/>
</Window.Resources>
که خود Things یه observablecollection هست ... بعد اینطور که متوجه شدم میگه باید یه نمونه از این CollectionViewSource رو بفرستیم برای viewmodel تا روش فیلتر و غیره رو اجرا کنیم ... چطوری باید اینو بفرستیم به viewmodel در حالی که ارجاع مستقیمی از view به viewmodel تو codebehind  اون نباید باشه ؟

یه سوال جدا ... من کار طراحی این نرم افزار رو بر طبق اصول oop و با ایجاد نمودارهای فعالیت و یوزکیس و بعدش هم طراحی کلاس براش شروع کردم ... اون موقع اصلا قصد نوشتن برنامه چند لایه رو نداشتم ... بعد موقع ساخت با MVVM اشنا شدم ... حالا به نظرتون باید بشینم دوباره کلاس های برنامه رو از اول با دید برنامه نویسی چند لایه طراحی کنم یا از همین کلاس ها هم میشه استفاده کرد ... مچ کردنشون کم کم داره اذیتم می کنه ... اونجا تعاریف یه چیز دیگه بود اینجا یه چیز دیگه ... دقیقا نمی دونم کدوم قسمت رو کجای MVVM بزارم

----------


## Amir Oveisi

سلام

 داخل مدل نباید متد تعریف کنید. هر کاری که لازمه با مدل ها انجام بگیره توی ViewModel انجام بدید. میتونید Bussines Logic رو داخل ViewModel قرار بدید یا اینکه یک لایه جدا تعریف کنید (مثلا Service) و از اون داخل ViewModel استفاده کنید. اما اجباری به جدا کردن BL از VM وجود نداره. 
برای کار با دیتابیس شما یک لایه (مثلا Repository) ایجاد کنید و ازش تو VM (یا اگر لایه BL جداگانه دارید، در BL) استفاده کنید. هر چند اگر مستقیم از داخل VM هم با Entity Framework کار کنید، MVVM رو نقض نکردید. اما جدا کردنش طراحی شما رو بهتر میکنه.

سوال دومتون در مورد فیلتر کردن اینا رو درست متوجه نشدم لطفا بیشتر توضیح بدید.

در مورد سوال آخرتون هم باید بگم که اصولی بخواید کار کنید باید طراحی کلاس ها و دیاگرام ها و ارتباطاتشون رو باید اصلاح کنید بعد برید سراغ پیاده سازی هاشون.

----------


## morteza_2009

http://www.codeproject.com/Articles/...Grid-with-MVVMممنون که پاسخ دادید .... اون فیلتر رو از این ادرس اموزشی گرفتم .... توش توضیح داده چیکار کنیم ولی خودش اومده از یه فریم ورک استفاده کرده .... میخوام راه ساده فرستادن collectionviewsource از view به view model رو بدونم بدون اینکه mvvm رو زیر پا بزارم

----------

