Xamarin.Forms Formátování řetězců

Někdy je vhodné použít datové vazby k zobrazení řetězcové reprezentace objektu nebo hodnoty. Můžete například použít Label k zobrazení aktuální hodnoty Slider. V této datové vazbě Slider je zdrojem a cílem je Text vlastnost objektu Label.

Při zobrazování řetězců v kódu je nejvýkonnějším nástrojem statická String.Format metoda. Formátovací řetězec obsahuje kódy formátování specifické pro různé typy objektů a můžete zahrnout i další text spolu s naformátovanými hodnotami. Další informace o formátování řetězců najdete v článku o typech formátování v .NET.

StringFormat – vlastnost

Toto zařízení se přenese do datových vazeb: Vlastnost Binding (nebo StringFormat vlastnost Binding rozšíření značek) nastavíte StringFormat na standardní formátovací řetězec .NET s jedním zástupným symbolem:

<Slider x:Name="slider" />
<Label Text="{Binding Source={x:Reference slider},
                      Path=Value,
                      StringFormat='The slider value is {0:F2}'}" />

Všimněte si, že formátovací řetězec je oddělený znaky s jednoduchými uvozovkami (apostrof), které analyzátoru XAML pomáhají vyhnout se zacházením se složenými závorkami jako s jiným rozšířením značek XAML. V opačném případě je tento řetězec bez znaku jednoduché uvozovky stejný řetězec, který byste použili k zobrazení hodnoty s plovoucí desetinnou čárkou ve volání String.Format. Specifikace F2 formátování způsobí, že se hodnota zobrazí se dvěma desetinnými místy.

Vlastnost StringFormat dává smysl pouze v případě, že cílová vlastnost je typu string, a režim vazby je OneWay nebo TwoWay. U obousměrných StringFormat vazeb platí pouze pro hodnoty předávané ze zdroje do cíle.

Jak uvidíte v dalším článku o cestě vazby, datové vazby se můžou stát poměrně složité a konvolutované. Při ladění těchto datových vazeb můžete do souboru XAML přidat Label soubor XAML s StringFormat cílem zobrazit některé zprostředkující výsledky. I když ho použijete jenom k zobrazení typu objektu, může to být užitečné.

Stránka Formátování řetězce znázorňuje několik použití StringFormat vlastnosti:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:sys="clr-namespace:System;assembly=netstandard"
             x:Class="DataBindingDemos.StringFormattingPage"
             Title="String Formatting">

    <ContentPage.Resources>
        <ResourceDictionary>
            <Style TargetType="Label">
                <Setter Property="HorizontalTextAlignment" Value="Center" />
            </Style>

            <Style TargetType="BoxView">
                <Setter Property="Color" Value="Blue" />
                <Setter Property="HeightRequest" Value="2" />
                <Setter Property="Margin" Value="0, 5" />
            </Style>
        </ResourceDictionary>
    </ContentPage.Resources>

    <StackLayout Margin="10">
        <Slider x:Name="slider" />
        <Label Text="{Binding Source={x:Reference slider},
                              Path=Value,
                              StringFormat='The slider value is {0:F2}'}" />

        <BoxView />

        <TimePicker x:Name="timePicker" />
        <Label Text="{Binding Source={x:Reference timePicker},
                              Path=Time,
                              StringFormat='The TimeSpan is {0:c}'}" />

        <BoxView />

        <Entry x:Name="entry" />
        <Label Text="{Binding Source={x:Reference entry},
                              Path=Text,
                              StringFormat='The Entry text is &quot;{0}&quot;'}" />

        <BoxView />

        <StackLayout BindingContext="{x:Static sys:DateTime.Now}">
            <Label Text="{Binding}" />
            <Label Text="{Binding Path=Ticks,
                                  StringFormat='{0:N0} ticks since 1/1/1'}" />
            <Label Text="{Binding StringFormat='The {{0:MMMM}} specifier produces {0:MMMM}'}" />
            <Label Text="{Binding StringFormat='The long date is {0:D}'}" />
        </StackLayout>

        <BoxView />

        <StackLayout BindingContext="{x:Static sys:Math.PI}">
            <Label Text="{Binding}" />
            <Label Text="{Binding StringFormat='PI to 4 decimal points = {0:F4}'}" />
            <Label Text="{Binding StringFormat='PI in scientific notation = {0:E7}'}" />
        </StackLayout>
    </StackLayout>
</ContentPage>

Vazby na formátových Slider TimePicker specifikacích a ukazují použití specifikací formátu, které jsou specifické pro double datové typy a TimeSpan typy dat. To StringFormat , které zobrazuje text z Entry zobrazení ukazuje, jak zadat dvojité uvozovky ve formátovacím řetězci s použitím &quot; entity HTML.

Další oddíl v souboru XAML je s nastavenou StackLayout příponou BindingContext x:Static značek, která odkazuje na statickou DateTime.Now vlastnost. První vazba nemá žádné vlastnosti:

<Label Text="{Binding}" />

Jednoduše se zobrazí DateTime hodnota výchozího BindingContext formátování. Druhá vazba zobrazí Ticks vlastnost DateTime, zatímco ostatní dvě vazby zobrazují DateTime sám sebe s konkrétním formátováním. Všimněte si tohoto StringFormat:

<Label Text="{Binding StringFormat='The {{0:MMMM}} specifier produces {0:MMMM}'}" />

Pokud potřebujete ve formátovacím řetězci zobrazit složené závorky vlevo nebo vpravo, stačí použít pár z nich.

Poslední oddíl nastaví BindingContext hodnotu Math.PI a zobrazí ji s výchozím formátováním a dvěma různými typy číselného formátování.

Tady je spuštěný program:

Formátování řetězců

Modely ViewModels a Formátování řetězců

Pokud používáte Label a StringFormat zobrazujete hodnotu zobrazení, které je také cílem modelu ViewModel, můžete definovat vazbu ze zobrazení do Label modelu ViewModel nebo z modelu ViewModel do objektu Label. Obecně platí, že druhý přístup je nejlepší, protože ověřuje, že vazby mezi zobrazením a modelem ViewModel fungují.

Tento přístup se zobrazuje v ukázce lépe barevného výběru , který používá stejný model ViewModel jako jednoduchý program pro výběr barev zobrazený v článku Režim vazby:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:DataBindingDemos"
             x:Class="DataBindingDemos.BetterColorSelectorPage"
             Title="Better Color Selector">

    <ContentPage.Resources>
        <ResourceDictionary>
            <Style TargetType="Slider">
                <Setter Property="VerticalOptions" Value="CenterAndExpand" />
            </Style>

            <Style TargetType="Label">
                <Setter Property="HorizontalTextAlignment" Value="Center" />
            </Style>
        </ResourceDictionary>
    </ContentPage.Resources>

    <StackLayout>
        <StackLayout.BindingContext>
            <local:HslColorViewModel Color="Sienna" />
        </StackLayout.BindingContext>

        <BoxView Color="{Binding Color}"
                 VerticalOptions="FillAndExpand" />

        <StackLayout Margin="10, 0">
            <Label Text="{Binding Name}" />

            <Slider Value="{Binding Hue}" />
            <Label Text="{Binding Hue, StringFormat='Hue = {0:F2}'}" />

            <Slider Value="{Binding Saturation}" />
            <Label Text="{Binding Saturation, StringFormat='Saturation = {0:F2}'}" />

            <Slider Value="{Binding Luminosity}" />
            <Label Text="{Binding Luminosity, StringFormat='Luminosity = {0:F2}'}" />
        </StackLayout>
    </StackLayout>
</ContentPage>    

Nyní existují tři páry Slider a Label prvky, které jsou vázány na stejnou zdroj vlastnost v objektu HslColorViewModel . Jediným rozdílem StringFormat je, že Label má vlastnost k zobrazení každé Slider hodnoty.

Lepší selektor barev

Možná vás zajímá, jak můžete zobrazit hodnoty RGB (červené, zelené, modré) v tradičním dvouciferném šestnáctkovém formátu. Tyto celočíselné hodnoty nejsou přímo dostupné ze Color struktury. Jedním z řešení by bylo vypočítat celočíselné hodnoty barevných komponent v rámci modelu ViewModel a zveřejnit je jako vlastnosti. Pak je můžete naformátovat pomocí X2 specifikace formátování.

Další přístup je obecnější: Můžete napsat převaděč hodnot vazby, jak je popsáno v pozdějším článku o převaděčích hodnot vazby.

Další článek ale podrobněji prozkoumá cestu vazby a ukáže, jak ji můžete použít k odkazu na dílčí vlastnosti a položky v kolekcích.