Condividi tramite


Formattazione di stringhe

Browse sample. Esplorare l'esempio

In un'app .NET Multipiattaforma App UI (.NET MAUI) è talvolta utile usare i data binding per visualizzare la rappresentazione di stringa di un oggetto o di un valore. Ad esempio, si può usare Label per visualizzare il valore corrente di un elemento Slider. In questo data binding, Slider rappresenta l'origine, mentre la destinazione è la proprietà Text di Label.

La formattazione delle stringhe nel codice viene in genere eseguita con il metodo statico String.Format . La stringa di formattazione include codici di formattazione specifici per i vari tipi di oggetti e ai valori da formattare è possibile aggiungere altro testo. Per altre informazioni, vedere Formattazione dei tipi in .NET per altre informazioni sulla formattazione delle stringhe.

La formattazione delle stringhe può essere eseguita anche con i data binding impostando la StringFormat proprietà di Binding (o la StringFormat proprietà dell'estensione Binding di markup) su una stringa di formattazione .NET standard con un segnaposto:

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

In XAML la stringa di formattazione è delimitata da caratteri tra virgolette singole per aiutare il parser XAML a evitare di trattare le parentesi graffe come un'altra estensione di markup XAML. In questo esempio, la specifica di formattazione di F2 fa sì che il valore venga visualizzato con due posizioni decimali.

Nota

L'uso della StringFormat proprietà ha senso solo quando la proprietà di destinazione è di tipo stringe la modalità di associazione è OneWay o TwoWay. Per i data binding bidirezionali, StringFormat è applicabile solo per i valori che passano dall'origine alla destinazione.

Nell'esempio seguente vengono illustrati diversi usi della StringFormat proprietà :

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             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>
        <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>        
    </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>

In questo esempio, le associazioni in Slider e TimePicker mostrano l'uso di specifiche di formato specifiche specifiche per double e TimeSpan tipi di dati. L'elemento StringFormat che visualizza il testo dalla vista Entry illustra come specificare virgolette doppie nella stringa di formattazione usando l'entità HTML &quot;.

La sezione successiva del file XAML contiene un elemento StackLayout con un BindingContext impostato su un'estensione di markup x:Static che fa riferimento alla proprietà statica DateTime.Now. Il primo data binding non ha proprietà:

<Label Text="{Binding}" />

Verrà semplicemente visualizzato il valore DateTime di BindingContext con formattazione predefinita. Il secondo data binding visualizza la proprietà Ticks di DateTime, mentre gli altri due visualizzano DateTime con formattazione specifica.

Nota

Se è necessario visualizzare parentesi graffe sinistra o destra nella stringa di formattazione, usare una coppia di parentesi graffe. Ad esempio, StringFormat='{{0:MMMM}}'.

L'ultima sezione imposta l'oggetto BindingContext sul valore di Math.PI e lo visualizza con la formattazione predefinita e due tipi diversi di formattazione numerica:

String formatting.

ViewModels e formattazione delle stringhe

Quando si usa Label e StringFormat per visualizzare il valore di una visualizzazione che è anche la destinazione di un modello di visualizzazione, è possibile definire l'associazione dalla vista a Label o dal modello di visualizzazione a Label. In generale, il secondo approccio è ottimale perché verifica che le associazioni tra la visualizzazione e il modello di visualizzazione funzionino.

Questo approccio è illustrato nell'esempio seguente:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:DataBindingDemos"
             x:Class="DataBindingDemos.BetterColorSelectorPage"
             Title="Better Color Selector">
    <ContentPage.BindingContext>
        <local:HslColorViewModel Color="Sienna" />
    </ContentPage.BindingContext>

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

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

    <StackLayout Margin="20">
        <BoxView Color="{Binding Color}"
                 HeightRequest="100"
                 WidthRequest="100"
                 HorizontalOptions="Center" />
        <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>    

In questo esempio sono presenti tre coppie di Slider elementi e Label associati alla stessa proprietà di origine nell'oggetto HslColorViewModel . Ogni Label oggetto che accompagna un oggetto Slider ha una StringFormat proprietà per visualizzare ogni Slider valore:

Better color selector.