WPF: Konwertery w XAMLu

Na codeplex jest świetny projekt autorstwa Kenta Boogarta pozwalający na definiowane converterów w XAMLu.

Na przykład gdy chcielibyśmy podłączyć Visibility do stringa( wartości Tak lub Nie ) można by napisać:

<Label Content="Test123">
    <Label.IsVisible>
        <Binding Path="MaBycWidocznyTekstowo">
            <Binding.Converter>
                <con:MapConverter>
                    <con:Mapping From="TAK" To="{x:Static Visibility.Visible}"/>
                    <con:Mapping From="NIE" To="{x:Static Visibility.Collapsed}""/>
                </con:MapConverter>
            </Binding.Converter>
        </Binding>
    </Label.IsVisible>
</Label>

Może być jeszcze ciekawiej, bo w ExpressionConverter można stosować wyrażenia logiczne dla MultiBinding:

<MultiBinding>
    <MultiBinding.Converter>
        <con:ExpressionConverterExtension>
            <con:ExpressionConverterExtension.Expression>
                <![CDATA[
                {0} && {1} && {3} && !{2}
                ]]>
            </con:ExpressionConverterExtension.Expression>
        </con:ExpressionConverterExtension>
    </MultiBinding.Converter>
       <Binding Path="IsChecked" ElementName="_rammstein"/>
    <Binding Path="IsChecked" ElementName="_powderfinger"/>
    <Binding Path="IsChecked" ElementName="_nickelback"/>
    <Binding Path="IsChecked" ElementName="_ministry"/>
</MultiBinding>

Jedyny trick, z którego warto sobie zdawać sprawę to w pewnych okolicznościach multibinding z ExpressionConverterem może zwrócić wyjątek w trybie design w visual studio. Nie można wtedy już nic zrobić wizualnie, warto wtedy sprawdzić czy na każdym z bindingów jest ustawiona odpowiednia wartość FallbackValue.

Strona projektu wpf-converters

2 thoughts on “WPF: Konwertery w XAMLu

  1. WPF: Konwertery w XAMLu…

    Dziękujemy za publikację – Trackback z dotnetomaniak.pl…

  2. Bartek Szafko ? WPF: Konwertery w XAMLu…

    Dziękujemy za publikację – Trackback z dotnetomaniak.pl…

Leave a Reply

Your email address will not be published. Required fields are marked *