Поделиться через


Форматирование строк

Browse sample. Обзор примера

В приложении многоплатформенного пользовательского интерфейса приложений .NET (.NET MAUI) иногда удобно использовать привязки данных для отображения строкового представления объекта или значения. Например, может потребоваться использовать Label для отображения текущего значения Slider. В этой привязке данных Slider является источником, а целевым объектом является свойство Text объекта Label.

Форматирование строк в коде обычно выполняется статическим методом String.Format . Строка форматирования содержит коды форматирования для различных типов объектов и наряду с форматируемыми значениями может содержать другой текст. Дополнительные сведения см. в разделе "Типы форматирования" в .NET для получения дополнительных сведений о форматировании строк.

Форматирование строк также можно выполнить с помощью привязок данных, задав StringFormat свойство Binding (или StringFormat свойство Binding расширения разметки) стандартной строке форматирования .NET с заполнителем:

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

В XAML строка форматирования разделена одними кавычками, чтобы средство синтаксического анализа XAML не обрабатывало фигурные скобки как другое расширение разметки XAML. В этом примере спецификация F2 форматирования приводит к отображению значения с двумя десятичными разрядами.

Примечание.

StringFormat Использование свойства имеет смысл только в том случае, если целевое свойство имеет типstring, а режим привязки — OneWay илиTwoWay. Для двусторонних привязок StringFormat применимо только для значений, передаваемых из источника в целевой объект.

В следующем примере показано несколько вариантов StringFormat использования свойства:

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

В этом примере привязки для Slider и TimePicker показывают использование спецификаций формата, определенных double для типов данных и TimeSpan т. д. Свойство StringFormat, отображающее текст из представления Entry, показывает, как указать двойные кавычки в строке форматирования с использованием сущности HTML &quot;.

Следующий раздел в файле XAML называется StackLayout, и в нем для BindingContext задано расширение разметки x:Static, ссылающееся на статическое свойство DateTime.Now. Первая привязка не имеет свойств:

<Label Text="{Binding}" />

Это просто отображает значение DateTime объекта BindingContext с форматированием по умолчанию. Вторая привязка отображает свойство Ticks объекта DateTime, тогда как две другие привязки отображают само значение DateTime с определенным форматированием.

Примечание.

Если в строке форматирования нужно отобразить фигурные скобки слева или вправо, используйте пару из них. Например, StringFormat='{{0:MMMM}}'.

Последний раздел задает BindingContext значение Math.PI и отображает его с форматированием по умолчанию и двумя различными типами числовых форматов:

String formatting.

ViewModels и форматирование строк

При использовании Label и StringFormat отображении значения представления, которое также является целевым объектом модели представления, можно определить привязку из представления к Label представлению или из модели Labelпредставления. Как правило, второй подход лучше всего подходит, так как он проверяет, работают ли привязки между представлением и представлением.

Этот подход показан в следующем примере:

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

В этом примере существует три пары элементов, привязанных Slider к одному и тому же исходному свойству в объектеHslColorViewModel.Label Каждое Label , которое сопровождает Slider свойство StringFormat для отображения каждого Slider значения:

Better color selector.