ورود

View Full Version : مشکل در بایند یه نوع غیر nullable به صورت null هنگام PropertyChanged



PetekDincos
دوشنبه 21 آذر 1390, 22:29 عصر
با سلام
من یه جدول دارم که به یک ORM نگاشت شده و در این جدول یه پراپرتی با نوع double دارم که nullable نیست وقتی در کد xaml این پراپرتی را به یه کنترلی مثل Textbox بایند می کنم و UpdateSourceTriger را به صورت PropertyChanged قرار می دهیم هر وقت این پراپرتی مقدار null می گیره Error می ده می خواستم بدنم چطور برای این جدول که به این ORM نگاشت شده یک کلاس partial بنویسم و در داخل اون کلاس این پراپرتی رو در رویدادهای OnPropertyChanged,OnPropertyChanging چطور تغییر بدم و شاید هم این سوال به این بخش ربطی نداشته باشه اما چون در کد xaml این کار رو انجام می دم اینجا پرسیدم اگر لازم شد به بخش مورد نظر انتقال بدید با تشکر

مهدی فرزاد
چهارشنبه 23 آذر 1390, 00:15 صبح
سلام
این مسئله بسیار ساده قابل حل هست
راه حل شما استفاده از Converter هست
اگر روش استفادش رو نمیدونی بگو تا یک مثال بزنم

PetekDincos
چهارشنبه 23 آذر 1390, 13:09 عصر
با سلام
ممنون از پاسخگوییتون آقای فرزاد این راه حل به ذهن خودم نیز رسیده بود اما فکر کنم با امکانات موجود در ORM ها راحتر باشه چون این پراپرتی ها در فرم های مختلف استفاده شده اگر بخواهیم از Convertor ها استفاده کنیم بایستی همه این ها رو پیدا کرده و یه Convertor بهشون اعمال کنم اما اگه بشه با یه کلاس partial از خود Entity این مسئله رو حل کرد خیلی خوب می شه با تشکر

مهدی فرزاد
چهارشنبه 23 آذر 1390, 17:10 عصر
سلام
نیازی به پیدا کردن اونها نیست
برای مثال کد Converter زیر رو در نظر بگیرید
class NullConvertor : IValueConverter
{

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == "" | value == null)
return "0";
else
return value;
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{

return value;
}
}
این کد اگر مقدار Null یا String.Empty باشه عدد 0 رو بر میگردونه

حالا خیلی راحت به شکل زیر استفاده میشه
xmlns:local="clr-namespace:MyApp" mc:Ignorable="d"
<Window.Resources>
<local:NullConvertor x:Key="NullConvertor"/>
</Window.Resources>
.
.
<DataGridTextColumn Header="مبلغ" MinWidth="80" Binding="{Binding Cost, Converter={StaticResource NullConvertor}}" Width="*"/>
.
.

PetekDincos
چهارشنبه 23 آذر 1390, 18:52 عصر
با سلام
منظور من از پیدا کردن اونها اینه که مثلا از یه پراپرتی در 10 تا فرم استفاده شده برای اعمال Convertor برای این پراپرتی بایستی در همه این 10 فرم تعریف یک نام برای Convertor در Resource این فرم و اعمال کانورتور در قسمت بایندینگ کنترل می باشه که اگه این پراپرتی ها زیاد باشه و تعداد فرم ها نیز زیاد باشه یکمی مشکل می شه اما اگه راهی وجود نداشته باشه مجبور همین کار رو انجام بدم باتشکر

مهدی فرزاد
چهارشنبه 23 آذر 1390, 19:13 عصر
سلام
اول اینکه از اول باید فکرش میکردی و موقع ساخت فرم تنظیمات لازم رو انجام میدادی
دوم اینکه اگه از Blend استفاده کنی تعریف و تغییر Binding ها با دو سه کلیک ساده انجام میشه
راه دیگه اینه که در دیتابیس برای فیلد مورد نظر مقدار دیفالت تعریف کنی

PetekDincos
چهارشنبه 23 آذر 1390, 22:32 عصر
با سلام


اول اینکه از اول باید فکرش میکردی و موقع ساخت فرم تنظیمات لازم رو انجام میدادی

جوانی هزارتا دردسر


دوم اینکه اگه از Blend استفاده کنی تعریف و تغییر Binding ها با دو سه کلیک ساده انجام میشه

اگر از Blend استفاده کنم و یا به صورت دستی تو کد بنویسم برای خالتی که مثلا 100 تا فرم وجود داشته باشه باز یه دردسره همه اینها رو پیدا کنی و تغییر بدی


راه دیگه اینه که در دیتابیس برای فیلد مورد نظر مقدار دیفالت تعریف کنی

یه نوع double پیش فرض مقدارش 0 می باشه وقتی تو یه تکست باکس بایندش به صورت UpdateSourceTrigger=PropertyChanged تعریف می شه اگه مقدرا تکست برای Empty و یا null باشه این اکسپشن تولید می شه باز ممنون از توجهتون با تشکر

PetekDincos
پنج شنبه 24 آذر 1390, 13:45 عصر
با سلام
با استفاده از Convertor هم این مشکل حل نشد یه نمونه می زارم لطفا بررسیش کنید با تشکر

مهدی فرزاد
پنج شنبه 24 آذر 1390, 14:26 عصر
احتمال زياد در نوشتن كدهاي Converter اشتباه كردي
الان جايي هستم كه به ويژوال استوديو دسترسي ندارم
شب حتما بررسي ميكنم و نتيجش رو ميگم

مهدی فرزاد
پنج شنبه 24 آذر 1390, 21:09 عصر
سلام

کلاس رو به این شکل بنویس
public class NullConvertor : IValueConverter
{

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{

return value;
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{

if (value.ToString() == string.Empty | value == null)
return "0";
else
return value;
}
}