具有MarkupExtension的IValueConverter

汤姆

最近,我读到有关的内容,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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

IValueConverter with MarkupExtension

来自分类Dev

为什么WPF中同时具有TypeConverters和IValueConverter?

来自分类Dev

具有IValueConverter的图像源的WPF依赖属性

来自分类Dev

WPF:IValueConverter没有被调用

来自分类Dev

xaml没有看到我的ivalueconverter

来自分类Dev

是否有一个IValueConverter执行if-then

来自分类Dev

位置 31:28。未为带有 xamarin 表单应用程序的应用程序名称找到 MarkupExtension

来自分类Dev

通过远程桌面连接时带有 IValueConverter 的 NullReferenceException

来自分类Dev

在 INotifyPropertyChanged 上调用 IValueConverter 仅在开始时有效

来自分类Dev

在 INotifyPropertyChanged 上调用 IValueConverter 仅在开始时有效

来自分类Dev

如何传递IValueConverter参数?

来自分类Dev

IValueConverter并绑定DependencyObject

来自分类Dev

IValueConverter无法正常工作

来自分类Dev

枚举转换失败的 IValueConverter

来自分类Dev

IValueConverter 返回 int 数组

来自分类Dev

具有RavenDb的KeyNotFoundException

来自分类Dev

具有@EmbeddedId的StackOverflowError

来自分类Dev

具有.htaccess的RedirectRule

来自分类Dev

具有多个ArrayList

来自分类Dev

具有BaseAddress的HttpClient

来自分类Dev

具有YouTubeBaseActivity的getSupportActionBar

来自分类Dev

具有if条件的jbuilder

来自分类Dev

具有值的TSQL

来自分类Dev

具有TimeZone的SimpleDateFormat

来自分类Dev

具有IEnumerable的BeginForm

来自分类Dev

具有startActivityForResult的TaskStackBuilder

来自分类Dev

具有ConditionExpression的DynamoDb

来自分类Dev

具有UseExplorerThemes的VirtualTreeView

来自分类Dev

具有count(*)MySQL