gpt4 book ai didi

c# - 带有 MarkupExtension 的 IValueConverter

转载 作者:太空狗 更新时间:2023-10-29 20:58:30 25 4
gpt4 key购买 nike

最近我读到一个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 创建此转换器的新实例,对吗?

最佳答案

使用我从未见过在线使用的 MarkupExtension 的一个巨大优势是它可以让您将值传递给转换器,该转换器可以用作参数或返回值,例如:

public class CustomNullToVisibilityConverter : MarkupExtension, IValueConverter
{
public object NullValue { get; set; }
public object NotNullValue { get; set; }

public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) return NullValue;

return NotNullValue;
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}

用法:

...
Visibility="{Binding Property,
Converter={cnv:CustomNullToVisibilityConverter
NotNullValue=Visible, NullValue=Collapsed}}" />
...

请务必在 .xaml 中引用转换器的命名空间。


编辑:

有一件事我忘了提,是的,你是对的,因为这种方法每次使用时都会创建一个新的转换器实例,这是一个缺点。

然而,没有什么可以阻止您将带有 MarkupExtension 的转换器添加到资源字典中 - 这样它只会被实例化一次。像这样:

<cnv:CustomNullToVisibilityConverter x:Key="NullToVisibilityConverter"
NotNullValue=Visible, NullValue=Collapsed />
...
Visibility="{Binding Property, Converter={StaticResource NullToVisibilityConverter}" />
...

关于c# - 带有 MarkupExtension 的 IValueConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28501091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com