是否可以为内联绑定定义类型转换器(没有资源)?
这样的事情:
<Button Visibility="{Binding ElementName=checkBox, Path=IsChecked, Converter={new BooleanToVisibilityConverter}" />
答案 0 :(得分:8)
您可以通过自定义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);
}
}
现在您可以使用MarkupExtension内联来创建新的转换器:
<Button Visibility="{Binding Converter={local:BooleanToVisibilityConverter} ...}" .. />
答案 1 :(得分:7)
使用绑定语法是不可能的。但是可以使用元素语法:
<Button.Visibility>
<Binding ElementName="checkBox" Path=IsChecked>
<Binding.Converter>
<BooleanToVisibilityConverter />
</Binding.Converter>
</Binding>
</Button.Visibility>
但为什么你想要这样做吗?这意味着每个绑定实例都将创建一个新的转换器。从内存的角度来看,这并不高效。
答案 2 :(得分:3)
你可以这样做。 应工作。
的伪代码强> :
public static class ConverterHost
{
public static readonly MyCoolConverter converter = new MyCoolConverter ();
}
在XAML中,有些像这样:
{Binding Converter={x:Static conv:ConverterHost.converter }}
希望这有帮助。
问候。
答案 3 :(得分:2)
不,您必须先将转换器定义为某个地方的资源(窗口,用户控件等),然后才能在绑定中使用它。