PDA

View Full Version : مشکل در tabControl در دیتا بایندینگ #WPF C ، برنامه در نشان دادن محتوای tab ها مشکل دارد.



cardano7
جمعه 21 مرداد 1390, 12:10 عصر
سلام
من یک برنامه ی WPF به زبان #C نوشتم. اما در دیتا بایندینگ اون مشکل دارم.
برنامه ی من دارای یک tabControl هست که کاربر می تونه هر تعداد tab که می خواهد به اون اضافه کنه و نام tab را هم rename کنه.
داخل هر tab یک user control هست که دارای یک listView بوده و کاربر می تواند هر تعداد آیتم که می خواهد به این لیست اضافه کند.
tab ها با کلاس TabpageItem و آیتم های درون listView با کلاس InfoItem بایند شده اند. و با هر مرتبه خروج از برنامه تغییرات ذخیره می شوند.
در ابتدا که برنامه اجرا می شود کاربر tab ها را می بیند. در ابتدا هیچ کدام آنها انتخاب نشده اند. اگر هر یک از tab ها انتخاب شود، بنابر دیتا بایندینگ ایجاد شده، محتویات تب به درستی نشان داده می شوند:
73687

مشکل زمانی به وجود می آید که کاربر tab دیگری را انتخاب کند. در آن زمان محتوای آن tab خالی نمایش داده می شود:
73689

سورس برنامه را آپلود می کنم.
73692

از ارسال هر گونه ایده که بتونه کمکی بکنه سپاسگزارم.

Amir Oveisi
یک شنبه 23 مرداد 1390, 06:21 صبح
سلام
عرض کنم که من کدهاتون رو بررسی کردم، شیوه چند لایه ای که پیاده کرده بودید اصلا با WPF سازگار نیست، به خصوص Binding هاتون مشکل دار بودن و دلیل ایرادی که هم در برنامتون پیش اومده همین Binding ها بود.
این اصلاحات رو در کدهاتون اعمال کنید:
1- در فایل UserControlTabpageContent.xaml.cs متد لود رو کدش رو بردارید کلا.
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
//listView1.ItemsSource = (listView1.DataContext as InfoItem).InfoItemCollectio;
}
2- در فایل UserControlTabpageContent.xaml بایندینگ ListView رو به این شکل تغییر بدید:
<ListView ItemsSource="{Binding InfoItemCollection, Mode=TwoWay}"

اگر Mode=TwoWay رو قرار بدید کار نمیکنه و Exception میده چون ObservableCollection هاتون readonly هستن، اما اگر TwoWay نباشه کار میکنه. این مسئله رو بسته به نیاز خودتون درستش کنید. (ساختار کارتون ایراد زیاد داره به نظرم و کارتون رو پیچیده میکنه)
مشکل دلیلش این بود که متد Load که شما در اون به ItemsSource مقدار داده بودید یک بار در زمان ایجاد کنترل اجرا میشه و بر اساس شرایط بایندینگ به شکل خودکار خودش رو همگام نمیکنه به همین دلیل. سعی کنید تا جای امکان بایندینگ ها رو به شکلی در XAML بنویسید که فقط یک بار به MainWindow،دیتاکانتکست بدید و نیاز نباشه هی به کنترل هاتون تو code-behind به شکل دستی ItemsSource یا هر چیز مربوط به Binding ای بدید.
نکته دیگه این که سعی کنید در WPF اگر میخواید برنامه چند لایه بنویسید، از MVVM استفاده کنید.

موفق باشید

پ.ن
از ایده اضافه کردن آیتم تو منوی راست کلیک به این شکل خوشم اومد و کار جالبی بود که تا حالا ندیده بودم! :)

cardano7
یک شنبه 23 مرداد 1390, 10:18 صبح
سلام
در یک کلمه می تونم بگم نجاتم دادید.
خیلی وقته که تو چند تا سایت این سوال رو مطرح کرده بودم کسی نبود جواب بده.


نکته دیگه این که سعی کنید در WPF اگر میخواید برنامه چند لایه بنویسید، از MVVM استفاده کنید.
در مورد MVVM هم سرچ کردم این موارد را پیدا کردم.
http://www.dotnettips.info/2009/11/mvvm.html

http://www.box.net/shared/3i7gf3b7xd
http://www.box.net/shared/tam3vh71nz
http://www.box.net/shared/dlik4l5vgj
http://www.box.net/shared/ttm3rbeuee
http://www.box.net/shared/3fkuyhup2q

اگر منبع بهتری برای شروع سراغ دارید ممنون میشم معرفی کنید.



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

Amir Oveisi
یک شنبه 23 مرداد 1390, 14:12 عصر
سلام، خواهش می کنم.
این منابع که نوشتین برای آشنایی با مفهومش خوبه اما فقط در حد آشنایی میتونه کمکتون بکنه.
یکی از چیزایی که یادگیری MVVM رو سخت میکنه اینه که الان framework های زیادی برای راحت کردن با MVVM بوجود اومدن (که همه رو .NET هستن البته) مثل WPF Toolkit, Calsium, Prism و ... واسه همین developer ها نمیتونن تصمیم بگیرن که با کدوم کار کنن و یا خودشون (بدون استفاده از اون framework ها) کار کنن یا نه.
از طرفی با ازدیاد این framework ها، برداشت های مختلف و روش های پیاده سازی متفاوتی برای ساختار MVVM به وجود اومده و اینکه بخایم بگیم کدوم بهتره واقعا کار دشواریه. من هم به همین دلیل نمیتونم به راحتی منبع معرفی کنم، اما خودم با این شروع کردم:
http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

اگر بتونید مفهموش رو به خوبی درک کنید، و مفاهیم WPF و به خصوص Binding رو خوب بلد باشید، خودتون به راحتی میتونید تصمیم بگیرید که به چه شکل برید جلو.

پ.ن
برنامتون به عنوان اولین برنامه ای که میگید نوشتید، خیلی خوب بود و مشخص بود با دید باز و پیش بینی مناسب برنامه رو شروع کردید. :)

امیدوارم موفق باشید