2011-07-23 9 views

Odpowiedz

8

Można tworzyć i wystawiać konwertera poprzez zwyczaju MarkupExtension które dadzą Ci deklarację inline szukasz:

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); 
    } 
} 

Teraz można użyć inline MarkupExtension aby utworzyć nowy konwerter:

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

i chociaż nie pokazuję tego w moim przykładzie, prawdopodobnie chciałbyś, aby wewnętrzny konwerter był statyczny, tak aby każde rozszerzenie nie tworzyło nowego wystąpienia wewnętrznego konwertera – sellmeadog

+0

Cool! W połączeniu z ogólną składnią 'ValueConverter ' i konstruktorami parametrów markup (do przekazania na przykład boolowskiego argumentu NOT) będzie to bardzo dobre rozwiązanie. – Poma

2

Nie, trzeba określić konwertera jako zasób gdzieś (okno, usercontrol, etc.), zanim będzie można go używać w sposób wiążący.

+0

Nieprawda, można wyprowadzić konwerter z MarkupExtension i uniknąć definicji jako zasobu. – sam

7

Nie jest to możliwe przy użyciu składni powiązań. Ale jest to możliwe przy użyciu elementów składni:

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

ale dlaczego co chcesz to zrobić? Oznaczałoby to, że każda wiążąca instancja utworzy nowy konwerter. To nie jest wydajne z punktu widzenia pamięci.

3

Możesz zrobić coś takiego. Ta powinna działać.

Pseudokod:

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

aw XAML, tak somethign:

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

Nadzieja to pomaga.

Pozdrawiam.

Powiązane problemy