PDA

View Full Version : استفاده بهینه از Converter ها



mze666
جمعه 28 بهمن 1390, 10:26 صبح
سلام - با این روش شما میتونید مستقیم از Converter ای که درست کردید استفاده کنید و دیگه نیازی به تعریف Converter توی Window.Resources یا جای دیگه نیست.
تو این روش Converter ای رو که تعریف کردید علاوه بر این که اینترفیس IValueConverter رو implement میکنه از MarkupExtension هم باید مشتق بشه. به کد زیر توجه کنید:

[ValueConversion(typeof(DateTime), typeof(String))]
public class DateConverter : MarkupExtension, IValueConverter
{
private static DateConverter _converter = null;

public override object ProvideValue(IServiceProvider serviceProvider)
{
if (_converter == null)
{
_converter = new DateConverter();
}
return _converter;
}

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
// Your logic
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
یا این کار یک مقدار از Overhead نیز کم میشود و باعث افزایش سرعت میشود (ولی نه به شکل خیلی محسوس!)
بعد از این کار توی کد Xaml دیگه نیازی به تعریف کانورترتون ندارید و میتونید مستقیم ازش استفاده کنید:



<DataGrid>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Date, Converter={common:DateConverter}}" />
</DataGrid.Columns>
</DataGrid>


امیدوارم که بدردتون خورده باشه.

sinaone1
شنبه 29 بهمن 1390, 07:55 صبح
عزیز خیلی عالی بود ولی خوب شما متغیر private در Xaml رو حذف کردی و آوردی توی خود کلاس ، پس Overhead سر جاشه ، درسته ؟

mze666
شنبه 29 بهمن 1390, 10:44 صبح
سلام دوست عزیز - ما اگر بدون این روش جدید بخوایم استفاده کنیم همونطور که میدونید باید اول یه جایی مثل Window.Resources این کانورترمون رو تعریف کنیم و بعد با استفاده از StaticResource ازش استفاده میکردیم - لطفاً کد زیر رو نگاه کنید:


<Window.Resources>
<common:DateConverter x:Key="DateConverter" />
</Window.Resources>

<DataGrid>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Date, Converter={StaticResource DateConverter}}" />
</DataGrid.Columns>
</DataGrid>

ولی تو این حالت جدید ما کانورتر رو مستقیماً از MarkupExtension مشتق کردیم و نیازی به استفاده از StaticResource نیست. البته همونطور که گفتم این Overhead اصلاً محسوس نیست چون StaticResource ها Overhead زیادی ندارن (بر خلاف DynamicResource ها).