2011-07-23 26 views

回答

8

您可以创建并通过自定义MarkupExtension这会给你你正在寻找的inline声明暴露你的转换器:

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} ...}" .. /> 
+0

虽然我没有在我的示例中显示它,但您可能希望将内部转换器设置为静态,以便每个扩展都不会创建内部转换器的新实例 – sellmeadog

+0

酷!结合通用的'ValueConverter '和标记构造函数参数语法(例如传递布尔非参数)将是非常好的解决方案。 – Poma

2

不,你必须从某个地方定义转换为资源(窗口,用户控件等),才可以在绑定使用它。

+0

如果不是这样,您可以从MarkupExtension派生一个转换器并避免定义为资源。 – sam

7

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

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

为什么你会想这样做?这意味着每个绑定实例都会创建一个新的转换器。从记忆的角度来看,这并不有效。

3

你可以做这样的事情。这应该工作。

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

,并在XAML,somethign这样的:

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

希望这有助于。

问候。

相关问题