2011-07-23 59 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 }} 

希望這有助於。

問候。

相關問題