是否可以定义用于内联绑定的转换器(无需资源)

本文关键字:转换器 资源 绑定 定义 用于 是否 | 更新日期: 2023-09-27 18:03:06

是否可以定义用于内联绑定的类型转换器(无资源(?

像这样:

   <Button Visibility="{Binding ElementName=checkBox, Path=IsChecked, Converter={new BooleanToVisibilityConverter}" />

是否可以定义用于内联绑定的转换器(无需资源)

您可以通过自定义MarkupExtension创建和公开转换器,该将为您提供所需的内联声明:

public class BooleanToVisibilityConverterExtension : MarkupExtension, IValueConverter
{
  private BooleanToVisibilityConverter converter;
  public BooleanToVisibilityCoverterExtension() : base()
  {
    this.converter = new BooleanToVisibilityConverter();
  }
  public override object ProvideValue(IServiceProvider serviceProvider)
  {
    return this;
  }
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
    return this.converter.Convert(value, targetType, parameter, culture);
  }
  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  {
    return this.converter.ConvertBack(value, targetType, parameter, culture);
  }
}

现在,您可以使用内联标记扩展来创建新的转换器:

<Button Visibility="{Binding Converter={local:BooleanToVisibilityConverter} ...}" .. />

使用绑定语法是不可能的。但是可以使用元素语法:

 <Button.Visibility>
    <Binding ElementName="checkBox" Path=IsChecked>
        <Binding.Converter>
            <BooleanToVisibilityConverter />
        </Binding.Converter>
    </Binding>
 </Button.Visibility>

但是你为什么要这样做呢?这意味着每个绑定实例都将创建一个新的转换器。从内存的角度来看,这是没有效率的。

你可以做这样的事情。这应该有效。

伪代码

public static class ConverterHost 
{ 
    public static readonly MyCoolConverter converter = new MyCoolConverter (); 
}

在 XAML 中,如下所示:

{Binding Converter={x:Static conv:ConverterHost.converter }}

希望这有帮助。

问候。

不,必须先将转换器定义为某处的资源(窗口、用户控件等(,然后才能在绑定中使用它。