Форматирование строк
В приложении многоплатформенного пользовательского интерфейса приложений .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 "{0}"'}" />
<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 "
.
Следующий раздел в файле XAML называется StackLayout, и в нем для BindingContext
задано расширение разметки x:Static
, ссылающееся на статическое свойство DateTime.Now
. Первая привязка не имеет свойств:
<Label Text="{Binding}" />
Это просто отображает значение DateTime
объекта BindingContext
с форматированием по умолчанию. Вторая привязка отображает свойство Ticks
объекта DateTime
, тогда как две другие привязки отображают само значение DateTime
с определенным форматированием.
Примечание.
Если в строке форматирования нужно отобразить фигурные скобки слева или вправо, используйте пару из них. Например, StringFormat='{{0:MMMM}}'
.
Последний раздел задает BindingContext
значение Math.PI
и отображает его с форматированием по умолчанию и двумя различными типами числовых форматов:
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 значения:
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по