سئوالات و مباحث WPF

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
در این مثال Binding که در موردش صحبت می کنیم درسته ولی نه تنها حالت اش. حالت کلی اش اون UpdateSourceTrigger ها است که بهش اشاره کردم.

بله.

طبعا اگر Binding ئه بر اساس PropertyChanged عمل می کنه همینطوره.

بله.

توضیح تون ایراد داره، شما Binding رو در رخداد CollectionChanged دخیل کرده اید، در حالی که قبلا عرض کردم که Binding نقشی در رخداد CollectionChanged نداره. اگر Binding ای هم وجود نداشت همین مساله برای رابطه ObsevableCollection و کنترل رخ میداد.
Binding قبلا شیء ObsevableCollection یا هر نوع داده دیگری که منبع بوده به کنترل تحویل داده، دیگه اینکه بعدا در هنگام تغییرات داخلی اون شیء چه رخداد هایی منجر به بروز رسانی در کنترل میشه نه ربطی به Binding داره و نه واسطه این ارتباط ئه و نه در بروز شون نقشی داره و نه از کار افتادن Binding تاثیری در این بروز رسانی بخاطر تغییر داخلی شیء میذاره.

درست نیست. ایراد به واسطه Converter شما است نه Binding دستی. فرض کنید که مقدار مشخصه X با Binding به مشخصه Y انتقال داده میشه، نتیجه اش اینه که شیء داخل X که مبداء هست در مقصد که Y ئه قابل دسترسی است، یک ارجاع ساده به شیء و طبعا Y به همون شیء اشاره داره که X. و اگر این شیء یک مجموعه باشه، اضافه کردن آیتم در X هیچ فرقی با اضافه کردن آیتم در Y نداره، هر دوشون به یک شیء اشاره دارند، اگر X چهار عضو داشته باشه، یعنی Y چهار عضو داره. محال ئه که در مجموعه داخل X تغییری رخ بده در حالی که Y (به همون شیء اشاره می کنه) بدون بروز رسانی مونده باشه.

سلامی مجدد
خیلی ممنون استاد .

آها ، پس وقتی Binding میکنیم ، هر دوی Binding Source Property و هم Binding Target Property ، از همون شی استفاده میکنن (مثل اینکه یک شی را توی یک متغییر بریزیم و بعد همون متغییر را توی متغییر دیگه ای بریزیم) .

بنابراین وقتی یه پروپرتیِ دستی (به عنوان Binding Target Property) که بسازیم و یه کالکشن را هم بهش Binding کنیم (و از Converter استفاده نکنیم) ، فقط کافیه که یکبار کالکشنِ سورس مون ، مقداردهی بشه ، همون کالکشن ، به عنوان کالکشن Target مون در نظر گرفته میشه . پس دیگه مهم هم نیست که دیگه با هر بار اضافه شدن آیتم به کالکشنِ سورس مون ، خبری به Binding یا Target داده بشه .
حالا به کالکشن Source مون هم که هر تغییری بدیم و اعضایی را حذف یا اضافه کنیم ، یعنی به همون کالکشنِ Target مون همون تغییرات را داده بودیم (چون شیِ کالکشنِ هر دو پروپرتی ، یکی هستن) .


حالا مشکل این پروژه ام اینه که برای این Binding ، از Converter استفاده کردم .
یعنی چون در اینجا ، میخوایم در هر بار حذف و اضافه شدنِ آیتم ها به کالکشنِ Source مون ، خبر دار بشیم تا برای کالکشنِ Target مون تبدیل انجام بدیم ، Binding ، هیچ روال و رویدادی را وقتی که عضوی به کالکشنِ Source مون اضافه بشه ، در نظر نمیگیره و بصورت اتوماتیک خبر دار نمیشه و چون در اینجا نیاز به Convert داریم و بنابراین دو شیِ کالکشنِ Source و Target از هم جدا هستن و بنابراین نیاز داریم هر بار وقتی که آیتم های کالکشن سورس مون تغییر میکنن ، با خبر بشیم ، پس به روش Binding معمولی ، دیگه جواب نمیده .


بلکه باید درون رویداد CollectionChanged ئه ObsevableCollection ئه Source مون برای با خبر شدن از تغییر در آیتم های کالکشن اش استفاده کنیم و با متدِ BindingExpression.UpdateTarget ، کالکشنِ Target مون را وادار به آپدیت شدن کنیم تا Binding بتونه Converter را فراخونی کنه .

درست میگم؟
تشکر استاد .
 

the_king

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

آها ، پس وقتی Binding میکنیم ، هر دوی Binding Source Property و هم Binding Target Property ، از همون شی استفاده میکنن (مثل اینکه یک شی را توی یک متغییر بریزیم و بعد همون متغییر را توی متغییر دیگه ای بریزیم) .

بنابراین وقتی یه پروپرتیِ دستی (به عنوان Binding Target Property) که بسازیم و یه کالکشن را هم بهش Binding کنیم (و از Converter استفاده نکنیم) ، فقط کافیه که یکبار کالکشنِ سورس مون ، مقداردهی بشه ، همون کالکشن ، به عنوان کالکشن Target مون در نظر گرفته میشه . پس دیگه مهم هم نیست که دیگه با هر بار اضافه شدن آیتم به کالکشنِ سورس مون ، خبری به Binding یا Target داده بشه .
حالا به کالکشن Source مون هم که هر تغییری بدیم و اعضایی را حذف یا اضافه کنیم ، یعنی به همون کالکشنِ Target مون همون تغییرات را داده بودیم (چون شیِ کالکشنِ هر دو پروپرتی ، یکی هستن) .


حالا مشکل این پروژه ام اینه که برای این Binding ، از Converter استفاده کردم .
یعنی چون در اینجا ، میخوایم در هر بار حذف و اضافه شدنِ آیتم ها به کالکشنِ Source مون ، خبر دار بشیم تا برای کالکشنِ Target مون تبدیل انجام بدیم ، Binding ، هیچ روال و رویدادی را وقتی که عضوی به کالکشنِ Source مون اضافه بشه ، در نظر نمیگیره و بصورت اتوماتیک خبر دار نمیشه و چون در اینجا نیاز به Convert داریم و بنابراین دو شیِ کالکشنِ Source و Target از هم جدا هستن و بنابراین نیاز داریم هر بار وقتی که آیتم های کالکشن سورس مون تغییر میکنن ، با خبر بشیم ، پس به روش Binding معمولی ، دیگه جواب نمیده .


بلکه باید درون رویداد CollectionChanged ئه ObsevableCollection ئه Source مون برای با خبر شدن از تغییر در آیتم های کالکشن اش استفاده کنیم و با متدِ BindingExpression.UpdateTarget ، کالکشنِ Target مون را وادار به آپدیت شدن کنیم تا Binding بتونه Converter را فراخونی کنه .

درست میگم؟
نه الزاما، نیازتون برطرف کردن ایراد Converter بود، نه مجبور کردن Binding به Update کردن Target.
می توانستید از تبدیل به نوع دیگری استفاده نکنید، یا در همون Converter رخداد عامل تغییر رو به متد ای وصل کنید که شیء قبلا تبدیل شده رو به روز کنه (نه اینکه بخاطر هر تغییر شیء مجموعه جدیدی بسازید).
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
نه الزاما، نیازتون برطرف کردن ایراد Converter بود، نه مجبور کردن Binding به Update کردن Target.
می توانستید از تبدیل به نوع دیگری استفاده نکنید، یا در همون Converter رخداد عامل تغییر رو به متد ای وصل کنید که شیء قبلا تبدیل شده رو به روز کنه (نه اینکه بخاطر هر تغییر شیء مجموعه جدیدی بسازید).

خیلی ممنون استاد .
آها . پس رویداد CollectionChanged ئه ObsevableCollection ئه Source (که همون پروپرتی Drives هست) را مستقیما به کلاس Converter متصل کنم و به اعضای DrivesForView اضافه کنم (نه اینکه هر بار شی جدید برای کالکشنِ DrivesForView در Converter درست کنم) .
بله ، این طوری از هر لحاظ بهتر میشه .
همین تغییرات را برای همین راهکاری که فرمودین در پروژه ی زیر اِعمال کردم .
تشکر استاد . :rose:
 

پیوست ها

  • SettingBinding.rar
    79.1 کیلوبایت · بازدیدها: 0

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد استاد .
استاد ، میخوام آموزش wpf (که قبلا یکی دو قسمت اش را ساخته بودم) را بسازم .
قبلا میخواستم که پروژه ی بکاپ گیری ام را اول تمام کنم و بعد ادامه ی آموزش را بسازم .

با این روندی که ساخت پروژه طول میکشه (به همراه مسائل شخصی ام که باعث میشه بیشتر طول بکشه) ، و همچنین قضیه ی درآمدم ، تصمیم گرفتم که روی کاغذ ، هر دوی آموزش و ساخت پروژه را با هم پیش ببرم (که ساخت آموزش ، الویت ام باشه) اما در عمل ، همیشه بیش از 70 یا 80 درصد و گاها همه ی اوقات را اونی که الویت ام میشه ، به خودش اختصاص میده . چون به سختی میتونم همزمان روی 2 کار تقسیم کنم .

قسمت اول اش آماده شده بود :


اما چون بعدش خواستم که پروژه ام را تکمیل کنم ، به همین دلیل در جریانید که موقتا از اون موقع تا حالا ، آموزش را متوقف کردم .
دلیل دیگه ی توقف هم این بود که تجربه ام در wpf بهتر بشه که الحمدلله حس میکنم بهتر شد و مخصوصا آشنایی بهتری با mvvm پیدا کردم که شناخت بسیار کمی باهاش داشتم که همه لطف خدا توسط کمک های شما بود (که خیلی بابت اینها ازتون ممنونم) .

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

---------

بعد اینکه استاد من فروش این آموزش را با چند تا سایت مطرح کردم .
با بعضی ها هم بعدش آشنا شدم و هنوز مطرح نکردم .
توی اونهایی که مطرح کردم ، فعلا یکی شون قبول کردن ؛ بعضی های دیگه قبول نکردن (مثل فرادرس و یکی دو تای دیگه) ، بعضی ها را بخاطر شرایط ، من قبول نکردم (که معمولا مالی بودن و آموزش را یکباره میخریدن اون هم با قیمت بسیار کم در صورتی که ساخت این آموزش که بیش از 100 قسمتِ یک ساعته میشه ، بصورت متوسط ، یک سال یا ماه ها زمان میبره و یا بعضی شرایط دیگه داشتن که بالاخره مورد قبولم نبود) .

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

همچنین با سایت های دیگه مثل یاس دانلود و سبز لیرن و برنامه نویس و اینها احتمالا صحبت میکنم .
بستر فروش آموزش اگه آماده تر میبود یا اگه سایتی میداشتم ، خیلی خوب میشد .

ویژگی های WPF نسبت به Windows Form :


1) استفاده از XML در طراحی رابط کاربری :

- باعث جدا کردن طراحی رابط کاربری از منطق تجاری میشه .

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

استاد ، این جمله که "wpf اجازه میده که برنامه نویس و طراح ، کارشون را مجزا و همزمان انجام بدن" ، را یکی از آموزش دهنده ها در یکی از آموزش های udemy بصورت انگلیسی گفت . هر چند علاوه بر این ، ممکنه در سایتی هم دیده باشم .

به نظرتون این جمله ، دقیق هست؟
اگه دقیق هست ، به نظرتون ، به چه چیز و به چه قابلیت از wpf اشاره میکنه که باعث این جداسازی و همزمانیِ نوشتنِ رابط کاربری و منطق تجاری میشه؟

آیا منظورش صرف اینکه در wpf ، رابط کاربری را در xaml مینویسیم و منطق تجاری را در سی شارپ مینویسیم ، هست؟

اگه منظورش این باشه ، شاید چندان خوب یا دقیق به نظر نرسه چون بالاخره در هر دوی wpf و winform میشه ظاهر را بدون نوشتنِ مستقیمِ کد (در winform ، کد سی شارپ و در wpf ، کد xaml) و صرفا با درگ و دراپ کردن کنترل ها ، ساخت .

یا اینکه منظورش وقتی که معماری mvvm را پیاده سازی میکنیم ، هست؟ که با این معماری ، توسط viewmodel ، لایه های view و model را از هم جدا میکنیم؟

یا به نظرتون ، به هیچ کدوم از اینها مربوط نیست و فرضا آیا برای استفاده از Binding هست؟
فرضا برای اینه که در Binding ، پروپرتیِ Path اش ، یه مسیر (ای از پروپرتی ، فرضا به عنوان رشته) دریافت میکنه و حتی با عدم وجودِ اون مسیر ، همچنان اون برنامه ، حداقل اجرا (run) میشه ، هر چند ممکنه اگه اون مسیر (ی که در Binding مشخص شد) وجود نداشته باشه ، زمان اجرا ، Binding ای انجام نشه (هر چند در معماری mvvm ، بیشترین استفاده از Binding میشه) ؟

کلا میخواستم دقیق تر بدونم که همچون جمله ای که گفتن ، دقیقا برای کدوم ویژگی از wpf گفتن؟
اما هر چند ممکنه حتی درست باشه ، اما به نظر میاد که حتی به هیچ کدوم از این 3 گزینه ، خیلی زیاد نمیاد و شاید دقیق نباشه .
به نظرتون اون جمله ، دقیق هست؟

------------

بعد اینکه در سایت زیر ، برای ویژگی جداسازی mvvm ، همچین چیزی گفت که به نظرم دقیق هست :


  • Separation of concerns – Typically, there is a connection between the user interface and application logic, resulting in change-resistant, brittle code. MVVM cleanly separates the user interface from the application logic. Divorcing one from the other improves application maintenance. It also makes application evolution easier, thereby reducing the risk of technological obsolescence.

چون در این جمله که دقت کنید ، فقط از صفات تفصیلی (نسبت برتری با غیر از mvvm) برای mvvm اشاره کرد .
در این جمله گفت که عیب استفاده نکردن از mvvm ، کدهای مقاوم در برابر تغییرات (و همچنین کدهای شکننده که منظورش از شکننده را دقیق متوجه نشدم) هست (که احتمالا منظورش از تغییرات ، تغییراتِ چه کدهای لایه ی view یا model یا جایگزینی شون در آینده هست) .

یعنی نگفت که در mvvm ، صد درصد کدها ، تغییر پذیرند و در غیر mvvm ، صد درصد کدها ، تغییر ناپذیرند . بلکه گفت که غیر از mvvm ، مقاومت (بیشتر) دارن .

همچنین گفت که mvvm ، باعث بهبود نگهداری کد میشه (باز هم نگفت که کدهای غیر از mvvm را نمیشه نگه داری کرد) .
باز هم همچنین گفت که کدهای mvvm ، تکامل راحت تر دارن (نگفت کدهای غیر mvvm ، کلا تکامل ناپذیرند) .

یعنی در کل گفت کدهای mvvm ، بهتر هست و اینها (از صفت تفصیلی استفاده کرد) . یعنی نیومد بگه که چیزی که در mvvm بشه ، در غیر از mvvm نمیشه .

اما در اون جمله ای که گفتم اون طرف در آموزش udemy برای wpf گفت (که نمیدونم برای چه ویژگی ای از wpf گفت . هر چند احتمال میدم که برای معماری mvvm اش گفته باشه) ، از این صفت استفاده نکرد . صرفا گفت که در wpf میشه کار را همزمان و مجزا انجام داد (که به این معناست که در winform نمیشه . چون قبل اش معایب winform را گفته بود و میخواست ویژگی های wpf و winform را از هم جدا کنه) .

ببخشید زیاد شد .
تشکر استاد :rose:
 

the_king

مدیرکل انجمن
بعد یادم اومد که با سایت شما هم برای قرار دادن آموزش صحبت کنم . نمیدونم که سایت مجید آنلاین ، برای شماست یا کس دیگه ای یا کلا آموزش wpf را توش قبول میکنید که بذارید یا نه ، یا اگه آره ، شرایط خاصی دارید یا نه؟
یک زمانی مجید آنلاین فروشگاه داشت، اما من هیچوقت در این موارد مسئولیتی نداشتم. من فقط انجمن رو مدیریت می کردم.
الانم که فروشگاه تعطیل ئه. اگر بخواهید می توانید به مدیریت پیام بدهید اما من امکانات یا اختیاری در این مورد ندارم.
استاد ، این جمله که "wpf اجازه میده که برنامه نویس و طراح ، کارشون را مجزا و همزمان انجام بدن" ، را یکی از آموزش دهنده ها در یکی از آموزش های udemy بصورت انگلیسی گفت . هر چند علاوه بر این ، ممکنه در سایتی هم دیده باشم .

به نظرتون این جمله ، دقیق هست؟
بله.
اگه دقیق هست ، به نظرتون ، به چه چیز و به چه قابلیت از wpf اشاره میکنه که باعث این جداسازی و همزمانیِ نوشتنِ رابط کاربری و منطق تجاری میشه؟
اینکه ظاهر واسط کاربری میتونه بدون هیچگونه کد برنامه نویسی در XAML مشخص بشه. قبلا در این مورد صحبت کردیم.
آیا منظورش صرف اینکه در wpf ، رابط کاربری را در xaml مینویسیم و منطق تجاری را در سی شارپ مینویسیم ، هست؟
بله.
اگه منظورش این باشه ، شاید چندان خوب یا دقیق به نظر نرسه چون بالاخره در هر دوی wpf و winform میشه ظاهر را بدون نوشتنِ مستقیمِ کد (در winform ، کد سی شارپ و در wpf ، کد xaml) و صرفا با درگ و دراپ کردن کنترل ها ، ساخت .
شما چه بصورت خودکار و چه بصورت دستی نهایتا دارید کد سی شارپ در Designer تولید می کنید، مستقل از کد سی شارپ برنامه که نیست.
یا اینکه منظورش وقتی که معماری mvvm را پیاده سازی میکنیم ، هست؟ که با این معماری ، توسط viewmodel ، لایه های view و model را از هم جدا میکنیم؟
نه الزاما قواعد MVVM لازم نیست رعایت بشه.
یا به نظرتون ، به هیچ کدوم از اینها مربوط نیست و فرضا آیا برای استفاده از Binding هست؟
Binding در WinForms هم هست. وجودش هم نه ضروری است و نه کافی. Binding نبود هم خود برنامه نویس می توانست یک روالی رو جایگزینش کنه.
 

جدیدترین ارسال ها

بالا