C# 是否可以为绑定内联定义转换器(没有资源)?

C# 是否可以为绑定内联定义转换器(没有资源)?,c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,是否可以定义内联绑定的类型转换器(没有资源) 大概是这样的: <Button Visibility="{Binding ElementName=checkBox, Path=IsChecked, Converter={new BooleanToVisibilityConverter}" /> 不,您必须将转换器定义为某个地方的资源(窗口、用户控件等),然后才能在绑定中使用它。使用绑定语法是不可能的。但是可以使用元素语法: <Button.Visibility>

是否可以定义内联绑定的类型转换器(没有资源)

大概是这样的:

   <Button Visibility="{Binding ElementName=checkBox, Path=IsChecked, Converter={new 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 }}
希望这有帮助


注意。

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

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);
  }
}
现在,您可以使用MarkupExtension内联创建新的转换器:

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


虽然我没有在我的示例中展示它,但您可能希望使内部转换器成为静态的,这样每个扩展都不会创建内部转换器工具的新实例!结合泛型
ValueConverter
和标记构造函数参数语法(例如传递布尔值而不是参数),这将是一个非常好的解决方案。如果不是这样,您可以从MarkupExtension派生转换器,并避免将其定义为资源。