PDA

View Full Version : راهنمایی برای آغاز کار با فریم ورک catel



aghayex
پنج شنبه 12 بهمن 1391, 23:40 عصر
با سلام
آیا از دوستان کسی هست که با فریم ورک catel مربوط به معماری mvvm کار کرده باشه ؟

mze666
جمعه 13 بهمن 1391, 08:55 صبح
بله من کمتر از یک ماه پیش شروع کردم به یادگیری و الان پروژه ای که باهاش شروع کردم (حسابداری) دیگه 90% تمومه.
کجاش مشکل دارید؟ بگید شاید تونستم کمکتون کنم.

aghayex
جمعه 13 بهمن 1391, 19:47 عصر
تشکر فراوان از اعلام آمادگیتون
ابتدا کارهایی که شروع کردم رو میگم چون شاید مواردی رو رعایت نکرده باشم .
من این فریم رک رو با توجه به ارزیابی که در سایت بود از تمام فریم ورک های mvvm انتخاب کردم :
بعد اونو نصب کردم وطبیعتا به ویژوال استادیو 2010 من اضافه شد و ازش یه پروژه wpf رو شروع کردم .
اما پروژه ای که درست می کنه یه خطا می گیره و دلیل اون هم اینه که دو رفرنس catel.mvvm و Catel.Extensions.Controls رو خودش به پروژه اضافه نکرده که خودم دستی اونها رو اضافه کردم .
مورد دیگه اینه که این فریم ورک مفهوم windows و grid رو به ترتیب به datawindows و stackgrid تغیر داده و رفرنس datawindows در xmlns:Window="http://catel.codeplex.com"و رفرنس stackgrid در xmlns:catel="clr-namespace:Catel.Windows.Controls;assembly=Catel.Ex tensions.Controls"قرار داره که خودمون دستی فراخوانیشون کنیم .
حالا سوالاتی که برا من پیش اومده رو خدمتتون می گم.
1 - آیا برای بخش models می شه از entity framework استفاده کرد.
2 - در این فریم ورک برای اعتبار سنجی داده ها باید چکار کرد.
3 - در بخش viewmodels که مهمترین بخش این معماری هست کلا مشکل دام.
4 - چرا در بخش code behin هر ویندوز این عبارت اضافه شده .



public Main()
: base(DataWindowMode.Custom)
{
InitializeComponent();
}

در صورتی که به طور عادی باید این طور باشه



public Main()

{
InitializeComponent();
}

و دلیلشو می خواستم

mze666
جمعه 13 بهمن 1391, 21:25 عصر
سلام. خواهش میکنم.
شما وقتی اون فایل Catel رو نصب می کنید فقط ساختار پروژه رو براتون میسازه و فایل های مربوطه رو هیچکدوم رو به پروژتون اضافه نمیکنه (که خیلی عجیبه).
توی پروژتون با nuget باید catel.core و catel.mvvm و ... رو به پروژتون اضافه کنید.

در مورد اینکه برای بخش مدل میشه از EF استفاده کرد خودمم سوال دارم ولی من توی پروژم از EF Code First استفاده کردم، تمام پروپرتی ها رو با استفاده از modelprop (یک snippet در catel) هست ایجاد کردم. هیچ مشکلی پیش نیومده ولی به نظرم راه بهتر و درست تری هم باید وجود داشته باشه. در مورد Database First نمیدونم.

برای اعتبارسنجی داده ها این فریم ورک عالیه و میتونید هم از Data Annotaion ها مثل StringLength و Required و ... استفاده کنید هم از FluentValidation که یک کتابخانه عالی برای اعتبارسنجی هست استفاده کنید و یکی دو روش دیگه هم بود که الان درست یادم نمیاد.
برای اعتبارسنجی با FluentValidation یک کلاس میسازید مثلاً CustomerValidator که از AbstractValidator<CustomerViewModel> مشتق میشه و توی constructor اش قوانین اعتبارسنجی رو مشخص می کنید. من CustomerViewModel رو اعتبارسنجی میکنم ولی برای خود مدل هم میشه این کار رو کرد. اینجا کامل توضیح داده (http://catel.catenalogic.com/index.html?catel_extensions_fluentvalidation.htm)

بخش ViewModel قلب برنامه هستش و خیلی مفهوم سختی نداره. هر چیزی که توی UI نیاز دارید نشون بدید رو با پروپرتی مشخص میکنید (vmprop یا vmpropchanged) برای دکمه ها و ... هم Command مینویسید (vmcommand یا vmcmmandwithcanexecute یا ...) نمیدونم کجاش مشکل دارید تا دقیق بهتون بگم.

در بخش codebehind چون از DataWindow استفاده شده به این صورت هستش. DataWindow یک Window هستش که مخصوص این فریمورکه و پیشنهاد سازنده این فریمورک هم اینه که همیشه از همین DataWindow استفاده کنید و منم در تمام برنامم از همین DataWindow استفاده کردم.

StackGrid هم یک Grid توسعه یافته هستش که با استفاده ازش دیگه نیاز نیست مدام Grid.Row و Grid.Column رو مشخص کنید.

constructor این DataWindow ها چند تا پارامتر میتونه بگیره و میتونید همشون رو مقداردهی کنید یا نکنید (من همیشه تمام پارامترهاش رو مقداردهی می کنم به صورت زیر)
public ChangePasswordView(ChangePasswordViewModel viewModel)
: base(viewModel, DataWindowMode.Custom, null, DataWindowDefaultButton.None, true, InfoBarMessageControlGenerationMode.None)
{
InitializeComponent();
}
دلیلش هم مشخصه مثلاً اگر DataWindow.Custom بذارید یعنی میخواید از دکمه های مخصوص خودتون استفاده کنید نه از دکمه هایی که خود Catel برای Ok Cancel , ... میذاره پایین فرم.
یا مثلا InfoBarMessageControlGenerationMode.None میگه که برای این پنجره اون قسمتی که بالای فرم خطاها رو نشون میده قرار نده. و بقیش هم بخونید متوجه میشید.

در کل اینجا همه چیز توضیح داده شده (http://catel.catenalogic.com/)

اگه بازم سوالی بود در خدمتم.

aghayex
جمعه 13 بهمن 1391, 22:58 عصر
با تشکر
در مورد این توضیح :


در مورد اینکه برای بخش مدل میشه از EF استفاده کرد خودمم سوال دارم ولی من توی پروژم از EF Code First استفاده کردم، تمام پروپرتی ها رو با استفاده از modelprop (یک snippet در catel) هست ایجاد کردم. هیچ مشکلی پیش نیومده ولی به نظرم راه بهتر و درست تری هم باید وجود داشته باشه. در مورد Database First نمیدونم.

منظور من entity frame work هست و در مورد EF Code First یا Database First اطلاعاتی ندارم و اگه شما اطلاعاتی یا منبعی که این سه تا رو با هم مقایسه می کنن بگید ممنون میشم تا بهترین راه رو برای اتصال به دیتابیس انتخاب کنم

aghayex
جمعه 13 بهمن 1391, 23:19 عصر
دوست عزیز مبحث viewmodels در نظر من کمی سنگینه و علتش هم اینه که فقط در موردش توضیحات شنیدم و کد و یا مثالی رو ندیدم آیا شما یه مثال در قالب پروژه ندارید که مبحث اعتبار سنجی , کامندها , ردوبدل کردن داده بین view و viewmodels رو نشون بده ؟

mze666
جمعه 13 بهمن 1391, 23:24 عصر
بله. منظور منم Entity Framework Code First بودش. شما وقتی از Entity Framework استفاده میکنید یا Database First هستش (یعنی اول دیتابیس رو میسازید و بعد از روی دیتابیس فایل edmx ساخته میشه و...) یا Code First (یعنی اول کلاس و پروپرتی ها رو برای هر موجودیت تعریف میکنید و بر اساس اونا دیتابیس ایجاد میشه) که Code First هم روش جدیدتریه و هم به نظر خودم خیلی بهتره.
اینجا توضیح اینکه چرا Code First بهتره (http://www.dotnettips.info/post/831/ef-code-first-1)
اینجا هم سری آموزش Entity Framework که شامل روش Code First هم هستش. (http://www.dotnettips.info/search/label/entity%20framework)


در مورد سوال دومتون درباره مثال اینجا رو ببینید. (http://catelexamples.codeplex.com/)

aghayex
دوشنبه 16 بهمن 1391, 21:23 عصر
دوست عزیز والا من فعلا سر از اینها در نمیارم اگه ممکنه یه نمونه از ویندوز یا یه یوزر کنترل خودتو به همراه viemodels اونو بزاری ممنون میشم .

mze666
سه شنبه 17 بهمن 1391, 11:40 صبح
دوست عزیز اون لینک دومی که دادم مثالش کاملاً واضحه. نمیدونم شاید منظورتون از
سر از اینها در نمیارم Entity Framework هستش که والا خود منم از همون لینکی که دادم یاد گرفتم اصلاً کار سختی نیست.
یه پروژه ساده (مثال) درست کنید و بذارید اینجا تا ببینم چجوری کار کردید، روش صحبت کنیم و ببینینم کجاش مشکل دارید.

aghayex
سه شنبه 17 بهمن 1391, 16:44 عصر
نه منظورم همون الگوی catel هست نمی دونم چرا این مبحث رو برا خودم سخت می بینم .
حالا اگه شما یه سورس که مواردی مثل خواندن و نوشتن از یه کنترل از طریق viewmodels و اجرای یک دستور یه دکمه رو بزارید ممنون میشم

mze666
سه شنبه 17 بهمن 1391, 21:41 عصر
بگید کجاش مشکل دارید. اینجوری نمیشه کاری کرد. شرمنده ولی من وقت تهیه یه نمونه پروژه ندارم (در حالی که اون لینکی که دادم دقیقاً با مثال روش رو توضیح داده).
نمونه پروژه بذارید بگید دقیق کجاش مشکل دارید تا اگر تونستم راهنماییتون کنم.

aghayex
پنج شنبه 19 بهمن 1391, 15:01 عصر
مثال اول ) زمانی که یک ویندوز دیگه ای رو می سازیم و می خوایم با ویندوز اول نمایشش بدیم . که کلا هم به ویندوز ساخته شده گیر می ده و هم زمان نمایش اون
مثال دوم ) زمانی که یه پروژه رو شروع می کنیم خودش میاد یه ویندوز به نام MainWindows.xaml در پوشه View و یه کلاس به نام MainWindowViewModel در پوشه Viewmodels ایجاد می کنه حالا اگه من بیام کلا این کلاس رو پاک کنم و یه کلاس دیگه جایگزینش کنم خطا می گیره و هر چی در پروژه گشتم که کجا این نام کلاس در اونجا ذخیره شده تا تغییرش بدم پیدا نکردم .
سوال دیگه که دارم اینه که من یه ویندوز میسازم و یه کلاس هم در پوشه Viewmodels براش می سازم چطوری این دو تا باید به هم بایند بشن تا دستوری که من در ویندوز به یه کنترل بایند کردم همون دستور رو اجرا کنه ؟

mze666
پنج شنبه 19 بهمن 1391, 16:38 عصر
سلام. به صورت پیش فرض catel همون داخل فولدر View و ViewModel رو تشخیص میده. اگر بخواید این ViewModel و View هاتون رو جای دیگه ای قرار بدید باید توی App.xaml.cs یه سری تغییرات انجام بدید که توی پروژه مشخص کردم کد رو بخونید متوجه میشید. (در مورد ViewLocator و ViewModelLocator)

در کل این پروژه رو کدش رو بخونید خیلی از مشکلاتتون فکر کنم حل بشه.
این لینک رو هم حتماً نگاه کنید! (http://catel.catenalogic.com/)
بازم اگه سوالی بود در خدمتم.

aghayex
جمعه 20 بهمن 1391, 14:45 عصر
دوست عزیز خیلی خیلی تشکر از توجهتون و وقتی که برای مشکل من مییزارید
مشکل اول ) این الگو برا openfiledialog و ... کنترل خاصی داره ؟
مشکل دوم ) وقتی ویندوز دومی رو نشون می دم به صورت یه فرم دیالوگ نشون داده میشه ( یعنی دکمه ماکزیمم و مینیمم رو نداره ) هر چند که متد showdialog رو به show تغیر می دم اما فایده ای نداره
مشکل سوم ) نحوه کار با EF در این الگو رو نمی دونم و بحث اعتبار سنجی داده در این مدل چطوریه .
من یه نمونه گزاشتم که شامل سه ویندوز و یه دیتابیس که در دیتابیس دو تیبل هست ( تیبل رسمی و تیبل پیمانی ) حالا اگه لطف کنی و این نمونه رو طوری دستکاری کنی که بشه اعتبار سنجی و ذخییره و بازیابی درش رعایت بشه ممنون می شم

mze666
جمعه 20 بهمن 1391, 17:21 عصر
سلام.
برای OpenFileDialog از OpenFileService و برای SaveFileDialog از SaveFileService.
برای مشکل دوم من فکر میکردم این موضوع مربوط به ویندوز 8 میشه فقط. امتحان نکردم روی ویندوزهای دیگه. اما توی DataWindow خاصیت CanResize و ... رو دستکاری کنید شاید درست بشه.
نحوه کار با EF Database First رو نمیدونم.
اعتبارسنجی توی پروژه قبلی که گذاشته بودم انجام داده بودم ولی Comment کردم چون باید FluentValidation و Catel.FluentValidation رو نتصب میکردم که حجم میرفت بالا خودتون اون Package هایی که گفتم رو نصب کنید کدی که Comment کردم رو هم uncomment کنید درسته!

ولی خداییش یکبار اون لینکی که گفتم رو خوندید؟!
به خدا من هم از همونجا شروع کردم و تقریباً تمام مسائل توش توضیح داده شده.

aghayex
جمعه 20 بهمن 1391, 18:03 عصر
ولی خداییش یکبار اون لینکی که گفتم رو خوندید؟!
به خدا من هم از همونجا شروع کردم و تقریباً تمام مسائل توش توضیح داده شده.

دوست عزیز من به خاطر یه سری مسائل کمی عجله دارم اما در مورد این لینک http://catel.catenalogic.com/ (http://catel.catenalogic.com/) من هر چی دنبال یه لینک تو این سایت گشتم که یه پروژه دانلود کنم پیدا نکردم .
یا در مورد این لینک http://catelexamples.codeplex.com/ من تقریبا 27 پروژه ازش دانلود کردم که هیچکدومشون اجرا نمی شن

mze666
جمعه 20 بهمن 1391, 18:31 عصر
یه سری از پروژه های catelexamples مربوط به Silverlight و Windows Phone و ... هست که اگه Sdk اینایی که گفتم رو نداشته باشید اجرا نمیشن. ولی قسمت WPF اش کامل درسته و برای اکثر نیازها مثال ارائه داده. حتی اگر اجرا هم نشن با خوندن کدش میتونید اطلاعات مفیدی کسب کنید.
توی catel.catenalogic فقط توضیح این فریمورک هستش و تمامی امکانات این فریمورک شرح داده شده و کدی برای دانلود اونجا وجود نداره.

aghayex
شنبه 21 بهمن 1391, 18:25 عصر
برای مشکل دوم من فکر میکردم این موضوع مربوط به ویندوز 8 میشه فقط. امتحان نکردم روی ویندوزهای دیگه. اما توی DataWindow خاصیت CanResize و ... رو دستکاری کنید شاید درست بشه.

یعنی شما هم همین مشکل رو دارید ؟
به نظرتون این یه قانون در این فریم ورک نیست ؟
اگه اینطوری باشه تنها راه استفاده از user control هست !
شما برا کار با event ها چطور کار می کنید . تو سمپل اومده برای ست کردن یه تابع به یه رویداد از روش زیر استفاده کرده که هم حجم کد نویسی رو بالا می بره و هم برا کنترل هایی مثل treeview که برا هر treeview item نمیشه چنید کدی رو نوشه یعنی عذاب آوره

<DataGrid.InputBindings>

<MouseBinding Gesture="LeftDoubleClick" Command="{Binding grdList_MouseDoubleClick}">

</MouseBinding>

</DataGrid.InputBindings>

یا در یه جایی اومدی این کد رو گفته که وقتی من استفاده می کنم خطا می ده :

<TreeView Name="treeView1"
local:CommandBehavior.DoubleClickCommand="{Binding ClickedItem}"
local:CommandBehavior.CommandParameter="{Binding ElementName=treeView1, Path=SelectedItem}">

mze666
شنبه 21 بهمن 1391, 21:35 عصر
بله ولی گفتم من فقط رو ویندوز 8 امتحان کردم و خیلی با پروپرتی هاش (مثل CanResize و WindowStyle و ... ) ور نرفتم ببینم درست میشه یا نه.
شایدم مخصوص این فریمورک باشه که احتمالش خیلی ضعیفه. باید توی CodePlex از سازندش بپرسید.
کار با Event ها هم فوق العاده ساده هستش. نوشتن Command اگه از Code Snippet های خود فریمورک استفاده کنید (vmcommand) چند ثانیه بیشتر وقت نمیبره و اصلاً کار سختی نیست.
در مورد قطعه کد اخرتون هم شما درست کار نکردید و این یعنی شما هنوز اون لینک رو نخوندید! چون در قسمت Catel.MVVM -> Behaviors and Triggers کاملآً واضح با یک قطعه کد توضیخ داده. (http://catel.catenalogic.com/)

mze666
دوشنبه 23 بهمن 1391, 10:23 صبح
در مورد پنجره (نمایش دکمه های Minimize و Maximize) هم باید پروپرتی ResizeMode پنجره مورد نظر رو برابر CanResize قرار بدید. یعنی حتماً باید این پروپرتی مقداردهی بشه برخلاف یک Window معمولی که به صورت پیش فرض CanResize هستش.