Meistens werden die in XAML benötigten Konverter lokal in den Resourcen einer Seite oder eines Benutzersteuerelements definiert. Das ist teilweise etwas umständlich, da zudem noch der Namespace referenziert werden muss. Dadurch entsteht viel doppelter Code, der die meist ohnehin schon umfangreichen Quelldateien unnötig wachsen lässt.

Hier ist ein Beispiel dafür:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<Page
    x:Class="GlobalConverters.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:converter="using:GlobalConverters.Converters">

    <Page.Resources>
        <converter:StringToVisibilityConverter x:Name="StringToVisibilityConverter"/>
    </Page.Resources>

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <TextBlock Visibility="{Binding TextVisible, Converter={StaticResource StringToVisibilityConverter}}"/>
    </Grid>
</Page>

(Listing 1: Verwendung eines IValueConverters - Zusätzlicher Namespace und Resource müssen eingebunden werden)

Ressourcendateien

In vielen Fällen bietet es sich deshalb an, die Wertkonverter des Projekts global in einer Resourcendatei zu definieren und in der App.xaml einzubinden:

1
2
3
4
5
6
7
8
9
<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:GlobalConverters.Converters">

    <local:StringToVisibilityConverter x:Name="StringToVisibilityConverter"/>

    <!-- More converters here... -->
</ResourceDictionary>

(Listing 2: Resourcendatei mit allen Konvertern)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<Application
    x:Class="GlobalConverters.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:GlobalConverters">

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/Converters/MyConverters.xaml"/>

                <!-- Global styles and other resources...-->
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

(Listing 3: App.xaml mit eingebundener Konverterliste)

Ergebnis

Durch dieses Vorgehen können alle Wertkonverter in allen Seiten und Benutzersteuerelementen verwendet werden, ohne das diese erst in den lokalen Resourcen referenziert werden müssen.

1
2
3
4
5
6
7
8
9
10
11
<Page
    x:Class="GlobalConverters.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <TextBlock Visibility="{Binding TextVisible, Converter={StaticResource StringToVisibilityConverter}}"/>
    </Grid>
</Page>

Beispielprojekt

Das Beispielprojekt ist hier zu finden.