یک مجموعه از ComboBoxItem ها تشکیل شده که علاوه بر نگهداری رشته خروجی DriveInfoFormatted هر رفتاری که در ComboBox در مورد اون آیتم انجام میشه، فرضا انتخاب شدن آیتم رو (IsSelected) حفظ می کنه. ComboBox تغییرات رو روی این ComboBoxItem اعمال کرده و شما هم حفظ اش کردید. اگر همچین مجموعه ای حفظ بشه، در دفعات بعدی ComboBox نتیجه فعالیت قبلی رو بخاطر داره و همون رو نشون میده.
ComboBoxItem هایی دارید که خودشون هستند ولی ItemsControl ای که باید والدشون باشه دیگه در دسترس نیست.
خیلی ممنون استاد .
واقعا کمکم کردین و خدا بوسیله ی شما ، مشکلم را حل کرد .
مدتی بود واسه ی این مشکل گیر کرده بودم .
مشکل را تقریبا احتمالا یافتم .
چند مدتی بود اون ارور را میداد و فکر هم نمیکردم که این ارور ، به مشکل قبلی مربوط باشه . امروز گفتم اول برم این ارورِ بایندینگ را حل کنم و بعدا مجددا سراغ حل مشکل قبلی برم (که خدا این رو جلو راهم گذاشت) .
بله استاد ، هر دوی این مشکلات (هم ارور بایندینگ و هم مشکل رفتار کمبوباکس) ، به نوعِ Source شون که پروپرتیِ FixedDriveComboBoxItems و از نوعِ List<ComboBoxItem> بود ، بود .
من نوعِ این پروپرتی را به List<string> تغییر دادم و همه ی مشکلات با هم حل شدن (شی ها برای پروپرتی های UI و همچنین برای پروپرتی های مربوط به ViewModel در تمام کلاس ها ، یک شیِ واحد هستند و شی جدیدی در کلاس های مختلف ، نیستن) :
- یعنی دیگه هم ارور بایندینگ را نمیده .
- هم مشکلِ اینکه وقتی در کمبوباکسِ صفحه ی SettingWindow ، یه آیتمی را انتخاب میکردم و بعد در کمبوباکسِ صفحه ی ExceptionManagementWindow ، همون آیتم ، انتخاب شده بود و برعکسش ، درست شد (با اونکه پروپرتیِ UI ، در همه ی کلاس ها از یک شیِ واحد استفاده میکنن و در نتیجه ، هر دو کمبوباکس ، به شیِ واحد از CollectionView متصل شده ، اما چون در این کمبوباکس ها ، مقدارِ پروپرتیِ IsSynchronizedWithCurrentItem ست نشده ، این مشکل هم حل شد) .
البته الان که میبینم ، این مشکل ، دقیقا شبیه اون نیست . چون وقتی پروپرتیِ IsSynchronizedWithCurrentItem را true میکنیم ، مقدارِ انتخاب شده در تمپلیتی که از کمبوباکس استفاده میکنم ، علاوه بر اینکه در قسمتِ آیتم ها هم تیک میخوره ، در قسمتِ TextBox ئه کمبوباکس هم آیتم انتخابی ، نوشته میشه . اما در مشکل قبلی ، فقط تیک میخورد) .
- و هم اینکه رفتار یک کمبوباکس وقتی چندین بار وارد صفحه اش میشدیم ، با چندین انتخاب در آیتم ها ، چندین تای اونها را انتخاب میکرد (که عکسش را در صفحه ی قبل نشون دادم) ، هم حل شد .
-----------------------------
الان استاد ، این مشکلات ، ربط به این داره که چون داریم از کمبوباکس استفاده میکنیم ، پس نباید پروپرتیِ Source مون از نوعِ آیتم های کمبوباکس ، یعنی از نوعِ ComboBoxItem باشه؟
اگه آره ، من متوجه ی ربط شون نشدم . چرا باید با انتخاب نوع ComboBoxItem ، این مشکلات پیش بیاد؟
اگه نه ، پس بخاطر چیه که با تغییر نوع داده ی این پروپرتی ، همه ی مشکلات حل شد؟
هر چند ، متوجه نشدم چرا وقتی نوع این پروپرتی ، ComboBoxItem بود ، با شیِ جدید دادن به پروپرتی های مربوط به ViewModel و UI ، این مشکل حل میشد .
======================
اما سئوال مهم اینه که اولا ، کلا آیا نمیشه از نوعِ ComboBoxItem استفاده کنم (جوری که مثل List<String> ، که مشکلی پیش نمیاد ، این مشکلات پیش نیاد) ؟ و اساسا چرا وقتی از ComboBoxItem استفاده میکنم ، این مشکلات پیش میاد؟
چرا وقتی که بایندینگ نمیکردم و صرفا با متد ، در رویداد لود ، کمبوباکس را با همین نوعِ ComboBoxItem پر میکردم ، این مشکلات بوجود نمیومد (بجز ارور بایندینگ که مشخص بود و دلیلش را گفتین) ؟
مهمتر اینکه ، من اساسا نوعِ ComboBoxItem را انتخاب کردم چون بتونم با مقدارِ پروپرتیِ Content اش ، مقدارِ رشته ای را در آیتم ها نمایش بدم و علاوه بر اون ، در پروپرتیِ Tag اش ، مقدار شیِ DriveInfo را بریزم تا بتونم وقتی که کاربر ، آیتمی را انتخاب کرد ، به شیِ DriveInfo ئه مربوط به اون آیتم ، (به راحتی در همون کمبوباکس) دسترسی داشته باشم .
یعنی یک نوعی را میخوام به عنوان ItemsSource ئه کمبوباکس انتخاب کنم که 2 نوع را در خودش ذخیره کنه .
حالا که دقیق نمیدونم چرا نوع ComboBoxItem نمیشه ، شما ، جایگزین این را چی پیشنهاد میدین که 2 مقدار بشه در اون ذخیره کرد ولی یک مقدار را فقط در معرض نمایش بذاره؟
فرضا شاید بشه نوعِ لیستی از دیکشنری را گفت . فرضا List<Dictionary<string, DriveInfo>> . اما در این صورت ، در Binding ئه xaml ، چی بنویسم که بفهمه من فقط اون قسمت و نوعِ string اش را میخوام در آیتم های کمبوباکس به نمایش بذارم و نشون بدم؟
یا هر نوع دیگه ای که پیشنهاد میدین که نمیدونم؟
خیلی ممنون استاد .