PDA

View Full Version : بحث و تبادل نظر در مورد MVVM Pattern در Wpf Programming



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

رضا عربلو
چهارشنبه 02 دی 1388, 00:21 صبح
می تونه بحث بسیار مفیدی بشه. امیدوارم که تمامی دوستان در اون شرکت کنند و به موضوع های انحرافی نپردازند.
(این نقطه شروع خوبی نیست ولی برای دلگرمی شما و دیگر دوستان ترجیح دادم بیاورم تا دوستان علاقه مند به شرکت در بحث بشوند.)
چیزیکه دست آخ در Model-View-ViewModel pattern به آن می رسیم فریم ورک هایی که آن را پیاده سازی می کنند . (منبع : http://www.japf.fr/2009/10/a-quick-tour-of-existing-mvvm-frameworks)


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

Somayeh_Zamani
شنبه 05 دی 1388, 10:15 صبح
پس من شروع به معرفی این Pattern می کنم امیدوارم که این تاپیک به تاپیک پربار و مفیدی تبدیل شود.

اما از همه دوستان خواهش می کنم که:

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



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



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



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



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

" پیشاپیش از همکاری و توجه شما سپاسگزارم "
SoZa

Somayeh_Zamani
شنبه 05 دی 1388, 11:49 صبح
Patterns، به بیان ساده؛ یعنی استفاده از Solutionهای ارائه شده برای یک مسئله خاص، در حل مسائل مشابه. به عبارت دیگر با استفاده از Design Patterns، می توانیم به استفاده مجدد از تجربه برسیم (Experience Reuse).
دوستان توجه داشته باشند که قبلا یک تاپیک هم با عنوان Design Pattern، در همین سایت، ساخته شده بوده.
http://www.barnamenevis.org/forum/showthread.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
پنج شنبه 24 دی 1388, 17:55 عصر
بحث بسیار عالی هست و من هم خیلی علاقه مندم.
این 2 reference هست که من کمی اونا رو مطالعه کردم ، اما راسیتش چیزه زیادی دستگیرم نشد :افسرده:

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

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

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

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

majid325
شنبه 17 بهمن 1388, 04:26 صبح
عنوان تاپیک هم گرم هست و هم قابل بحث.
این روزهای وقت زیادی ندارم ولی سعی میکنم این تاپیک رو دنبال کنم , دیدم تاپیک یه خورده سرد شده گفتم یه نمونه کد ساده که دوستان تازه کار هم زیاد تو پیچ و تابش سر در گم نشن بزارم شاید اشتیاق دوستان به ادامه بحث بیشتر بشه.
البته سعی میکنم همین نمونه رو یواش یواش کاملش کنم.

پست های بی محتوا حذف میشوند



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


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




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


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

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

http://barnamenevis.org/forum/showpost.php?p=1073862&postcount=5

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

Amir Oveisi
پنج شنبه 11 شهریور 1389, 07:57 صبح
سلام، خواهش می کنم
اگر دقت کرده باشید، برای هر command دو تا event هندل شده:

command_canExecute
command_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
پنج شنبه 11 شهریور 1389, 09:48 صبح
سلام و ممنون از اينكه وقت گذاشتيد

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

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

delasa
سه شنبه 14 دی 1389, 08:29 صبح
آموزش MVVM که شامل 5 قسمت است به همراه مثال

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

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

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

مهدی فرزاد
سه شنبه 14 دی 1389, 16:55 عصر
سلام
اگر کمی دقت کنید هر دو لینک آموزشهای آقای نصیری هست و این آموزش ها قبلا در سایت قرار داده شده

davoodrm666_666
چهارشنبه 15 دی 1389, 15:10 عصر
تو سايت windowsclient هم يه Video خيلي خوب با موضوع Data-driven پيدا كردم. http://windowsclient.net/learn/video.aspx?v=314683

reza105
یک شنبه 19 دی 1389, 13:26 عصر
البته این روزها شرکت های بزرگ برای خودشون یه orMap بهنیه شده مینویسند .


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

davoodrm666_666
یک شنبه 19 دی 1389, 14:03 عصر
يعني هرشركتي براي خودش يك framework مي نويسه كه يكي از وظايف framework ايجاد لايه ارتباط با ديتابيس هستش و معني oram يا Object relation Mapping هم اينه كه شما مي ياييد DataBase رو به صورت Object مي بينيد و باهشان به صورت ابجكتي كار مي كنيد كه از framework هايي كه اين كار رو انجام مي دهند Linq to Sql - entity framework - Plinqo و ... هستند

Somayeh_Zamani
یک شنبه 24 بهمن 1389, 09:35 صبح
عنوان تاپیک هم گرم هست و هم قابل بحث.
این روزهای وقت زیادی ندارم ولی سعی میکنم این تاپیک رو دنبال کنم , دیدم تاپیک یه خورده سرد شده گفتم یه نمونه کد ساده که دوستان تازه کار هم زیاد تو پیچ و تابش سر در گم نشن بزارم شاید اشتیاق دوستان به ادامه بحث بیشتر بشه.
البته سعی میکنم همین نمونه رو یواش یواش کاملش کنم.

پست های بی محتوا حذف میشوند

http://barnamenevis.images/misc/quote_icon.png نوشته شده توسط Somayeh_Zamani http://barnamenevis.images/buttons/viewpost-left.png (http://barnamenevis.showthread.php/?p=875826#post875826)
من این لایه رو معمولا با Linq2Sql یا Entity framework مایکروسافت ایجاد می کنم. شما چطور؟




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

http://barnamenevis.images/misc/quote_icon.png نوشته شده توسط Somayeh_Zamani http://barnamenevis.images/buttons/viewpost-left.png (http://barnamenevis.showthread.php/?p=875826#post875826)

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



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


@majid325 (http://barnamenevis.member.php?18075-majid325):
چرا نه به این صراحت؟!

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

PetekDincos
سه شنبه 10 اسفند 1389, 14:51 عصر
با سلام
من جدیدا می خوام این الگو رو یاد بگیرم سوال اولم در مورد اینکه کدامیک از Framework های این الگو از بقیه بهتره و سوال دوم در مورد اینکه این الگو تقریبا 30 درصد سرعت برنامه رو افزایش می ده آیا صحت داره و چگونه این کار رو انجام می ده با تشکر

PetekDincos
شنبه 14 اسفند 1389, 14:47 عصر
با سلام
کسی که به این سوال ما جواب نداد با خوندن مطالب آقای وحید نصیری فهمیدم که 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
شنبه 14 اسفند 1389, 15:02 عصر
با سلام
کسی که به این سوال ما جواب نداد با خوندن مطالب آقای وحید نصیری فهمیدم که 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>

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

كافيه كه يك 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
شنبه 14 اسفند 1389, 15:48 عصر
با سلام
مثلا 20 تا تکست باکس تو یه View وجود داره آیا باید برای این 20 تا تکست باکس همین کار ها رو تکرار کرد یه راهی وجود نداره که تکرار انجام نشه با تشکر

Hamishebahar
یک شنبه 22 اسفند 1389, 11:45 صبح
سلام بحث mvvm بحث شیرینیه...
دوست دارم ادامه بدید.

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

davoodrm666_666
یک شنبه 22 اسفند 1389, 13:53 عصر
با سلام
مثلا 20 تا تکست باکس تو یه View وجود داره آیا باید برای این 20 تا تکست باکس همین کار ها رو تکرار کرد یه راهی وجود نداره که تکرار انجام نشه با تشکر

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

farashah_jalal
شنبه 28 اسفند 1389, 22:52 عصر
با سلام
امیدوارم این بحث ادامه پیدا کند و من هم به تونم توی این بحث ها سهمی داشته باشم .
یک پروژه کوچکی را با mvvm و entitiy fram work نوشتم که در خدمت دوستان قرار می دم.
در این نمونه از linq to entity استفاده شده است. و در بعضی از مواقع هم از sp استفاده شده است.
اگر سوالی چیزی باشه در خدمتم . موفق باشید .سال نو مبارک:چشمک::لبخندساده:
67691

iranian_genius
چهارشنبه 09 شهریور 1390, 16:34 عصر
lمباحث این تاپیک بسیار بسیار مفید هست وحیفه این همه مدت بدون پست مونده ...

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

farashah_jalal
شنبه 12 شهریور 1390, 09:07 صبح
با سلام
در این تایپک برای شروع و کار با یان معماری بحث های مفیدی شده است و برای شروع می تونید از اونها استفاده کنید .
و اگر سوال و یا مشکلی بود می تونید مطرح کنید تا راهنمایتون کنیم.
با تشکر

mhs5862
چهارشنبه 11 بهمن 1391, 14:29 عصر
انگار source تون ناقصه چون فایل sln رو تداره و از قسمت file/open/project هم کردم یه عالمه خطا داد

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

Amir Oveisi
جمعه 10 آبان 1392, 15:53 عصر
خوب تا کسی ندونه از چه framework ای استفاده میکنید نمیتونه راهنماییتون کنه :)

saraparsa
شنبه 11 آبان 1392, 16:01 عصر
rastesh frameworkeshon khase khodeshone

saraparsa
شنبه 11 آبان 1392, 16:03 عصر
به هرحال من نحوه استفاده درست و ساخت یک usercontrol را نمی تونید همراه با یک sample برام توضیح بدین؟

morteza_2009
یک شنبه 19 آبان 1392, 20:32 عصر
سلام خدمت دوستان عزیز

من تازه شروع کردم به یادگیری 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
دوشنبه 20 آبان 1392, 22:31 عصر
سلام

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

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

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

morteza_2009
دوشنبه 20 آبان 1392, 23:45 عصر
http://www.codeproject.com/Articles/442498/Multi-filtered-WPF-DataGrid-with-MVVMممنون که پاسخ دادید .... اون فیلتر رو از این ادرس اموزشی گرفتم .... توش توضیح داده چیکار کنیم ولی خودش اومده از یه فریم ورک استفاده کرده .... میخوام راه ساده فرستادن collectionviewsource از view به view model رو بدونم بدون اینکه mvvm رو زیر پا بزارم