Compartilhar via


Formatação de cadeia de caracteres

Browse sample. Navegue pelo exemplo

Em um aplicativo .NET Multi-Platform App UI (.NET MAUI), às vezes é conveniente usar associações de dados para exibir a representação de cadeia de caracteres de um objeto ou valor. Por exemplo, talvez você deseje usar um Label para exibir o valor atual de um Slider. Nesta associação de dados, o Slider é a origem e o destino é a propriedade Text do Label.

A formatação de cadeia de caracteres no código normalmente é realizada com o método estático String.Format . A cadeia de caracteres de formatação inclui códigos de formatação para diversos tipos de objetos, sendo que você pode incluir outros textos junto com os valores que estão sendo formatados. Para obter mais informações, consulte Formatando tipos no .NET para obter mais informações sobre formatação de cadeia de caracteres.

A formatação de cadeia de caracteres também pode ser realizada com associações de dados definindo a StringFormat propriedade de (ou a StringFormat Binding propriedade da extensão de marcação) para uma cadeia de Binding caracteres de formatação .NET padrão com um espaço reservado:

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

Em XAML, a cadeia de formatação é delimitada por caracteres de aspas simples para ajudar o analisador XAML a evitar tratar as chaves como outra extensão de marcação XAML. Neste exemplo, a especificação de formatação de F2 faz com que o valor seja exibido com duas casas decimais.

Observação

O uso da StringFormat propriedade só faz sentido quando a propriedade de destino é do tipo string, e o modo de vinculação é OneWay ou TwoWay. Para vinculações bidirecionais, o StringFormat só é aplicável a valores que passam da origem para o destino.

O exemplo a StringFormat seguir demonstra vários usos da propriedade:

<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>

Neste exemplo, as associações no Slider e mostram o uso de especificações de formato específicas para double e TimePicker TimeSpan tipos de dados. O StringFormat que exibe o texto na exibição Entry demonstra como especificar aspas duplas na cadeia de caracteres de formatação com o uso da entidade HTML &quot;.

A próxima seção do arquivo XAML é um StackLayout com um BindingContext definido como uma extensão de marcação x:Static que referencia a propriedade estática DateTime.Now. A primeira associação não tem nenhuma propriedade:

<Label Text="{Binding}" />

Isso apenas exibe o valor DateTime do BindingContext com a formatação padrão. A segunda associação exibe a propriedade Ticks de DateTime, enquanto as outras duas associações exibem o próprio DateTime com formatação específica.

Observação

Se você precisar exibir chaves esquerdas ou direitas na cadeia de formatação de formatação, use um par delas. Por exemplo, StringFormat='{{0:MMMM}}'.

A última seção define o como o valor de e o BindingContext exibe com formatação padrão e dois tipos diferentes de Math.PI formatação numérica:

String formatting.

ViewModels e formatação de cadeia de caracteres

Ao usar Label e exibir o valor de um modo de exibição que também é o destino de um viewmodel, você pode definir a associação do view para o ou do viewmodel para o Label Label.StringFormat Em geral, a segunda abordagem é melhor porque verifica se as ligações entre o modo de exibição e o modelo de exibição estão funcionando.

Essa abordagem é mostrada no exemplo a seguir:

<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>    

Neste exemplo, há três pares de Slider elementos e Label que estão vinculados à mesma propriedade source no HslColorViewModel objeto. Cada Label um que acompanha um Slider tem uma StringFormat propriedade para exibir cada Slider valor:

Better color selector.