最近,我读到有关的内容,IValueConverter
它也继承自MarkupExtension
。就像这样:
internal class BoolToVisibilityConverter : MarkupExtension, IValueConverter
{
private static BoolToVisibilityConverter converter;
public BoolToVisibilityConverter()
{
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool)
{
if ((bool)value)
{
return Visibility.Visible;
}
}
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Visibility)
{
Visibility visibility = (Visibility)value;
if (visibility == Visibility.Collapsed)
{
return false;
}
}
return true;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return converter ?? (converter = new BoolToVisibilityConverter());
}
}
用法如下:
<Button Content="Delete" Visibility="{Binding CanDelete, UpdateSourceTrigger=PropertyChanged, Converter={local:BoolToVisibilityConverter}"/>
我曾经使用过来自Resource的转换器,例如:
<loc:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"/>
...
<Button Content="Delete" Visibility="{Binding CanDelete, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource BoolToVisibilityConverter}"/>
我的第一个问题是:什么是更好的方法?如果我使用MarkupExtension-Version
(它的用法更容易输入),它有什么优势?
我还看到了一个非常类似的实现,如下所示:
internal class BoolToVisibilityConverter : MarkupExtension, IValueConverter
{
public BoolToVisibilityConverter()
{
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool)
{
if ((bool)value)
{
return Visibility.Visible;
}
}
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Visibility)
{
Visibility visibility = (Visibility)value;
if (visibility == Visibility.Collapsed)
{
return false;
}
}
return true;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}
如果我理解正确,第一个解决方案将仅创建此转换器的一个实例。第二个为每个XAML创建此转换器的新实例,对吗?
在这种情况下,标记扩展提供的唯一(轻微)优点是更简洁的XAML语法。
代替这个:
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
...
{Binding SomeBooleanProperty, Converter={StaticResource BooleanToVisibilityConverter}}
您可以拥有:
{Binding SomeBooleanProperty, Converter={my:BoolToVisibilityConverter}}
我认为这不值得。如果您不喜欢保存击键,您可以缩短用于引用转换器的键:
<BooleanToVisibilityConverter x:Key="btvc" />
...
{Binding SomeBooleanProperty, Converter={StaticResource my:btvc}}
由于ProvideValue
标记扩展的方法是一个实例方法,因此只能在创建该类的实例后才能调用它。由于该类既是标记扩展又是转换器,因此代码的两个变体每次都会创建一个转换器。唯一的区别是,第一个变体将始终返回相同的转换器:但是,它不会阻止其他转换器的创建。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句