web-dev-qa-db-ja.com

バインド時のStringFormat

見る:

<TextBlock Text="{Binding Date}"/>

日付を「dd/MM/yyyy」に、つまり時間なしでフォーマットしたい。

私はそれを試してみました: <TextBlock Text="{Binding Date, StringFormat={}{0:dd/MM/yyyy}}"/>、しかしそれは機能しません。

エラーが発生します:プロパティ 'StringFormat'がタイプ 'Binding'で見つかりませんでした。

19
developer033

最良かつ最も簡単な方法は、日付を渡すコンバーターを使用して、書式設定された文字列を取得することです。例えばMyNamespace.Converters名前空間:

public class DateFormatConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value == null)
            return null;

        DateTime dt = DateTime.Parse(value.ToString());
        return dt.ToString("dd/MM/yyyy");
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

そして、xamlでコンバーターを参照し、次のコンバーターを追加します。

xmlns:conv="using:MyNamespace.Converters" 

あなたのxamlページとpage.resourcesにこれを追加してください

<conv:DateFormatConverter x:Name="DateToStringFormatConverter"/>

<TextBlock Text="{Binding Date, Converter={StaticResource DateToStringFormatConverter}"/>
20
CodeNoob

Binding classにはStringFormatという名前のプロパティはありません。 Converter および ConverterParameter を使用してこれを行うことができます。 表示用のデータ値のフォーマットまたは変換 を参照できます。

たとえば、ここでは、DatePickerの日付をTextBlockのテキストにバインドします。

XAML:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.Resources>
        <local:DateFormatter x:Key="DateConverter"/>
    </Grid.Resources>
    <DatePicker Name="ConverterParmeterCalendarViewDayItem"></DatePicker>
    <TextBlock Height="100" VerticalAlignment="Top" Text="{Binding ElementName=ConverterParmeterCalendarViewDayItem, Path=Date, Converter={StaticResource DateConverter},ConverterParameter=\{0:dd/MM/yyyy\}}" />
</Grid>

コードビハインド、DateFormatterクラス:

public class DateFormatter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        var a = language;
        // Retrieve the format string and use it to format the value.
        string formatString = parameter as string;
        if (!string.IsNullOrEmpty(formatString))
        {
            return string.Format(formatString, value);
        }

        return value.ToString();
    }

    // No need to implement converting back on a one-way binding
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return DependencyProperty.UnsetValue;
    }
}
5
Grace Feng

なぜ複雑になるのですか?コンパイル済みデータバインディングを使用できます

{x:Bind ViewModel.PropertyWithDateTime.ToString("....")}
4
Ivan

14393以降、 x:Bindの関数 を使用できます。

これは、次のように日付をフォーマットできることを意味します。

Text="{x:Bind sys:String.Format('{0:dd/MM/yyyy}', ViewModel.Date)}"

System名前空間への参照が含まれていることを確認してください。

<Page 
     xmlns:sys="using:System"
     ...
2
mcalex

私はこれが遅いことを知っていますが、私は同じ質問を持っていて、この解決策を思いつきました。最短ではなく、純粋なXAMLかもしれません。

    <TextBlock>
        <Run Text="{x:Bind Foo.StartDate.Day}"/>.<Run Text="{x:Bind Foo.StartDate.Month}"/>.<Run Text="{x:Bind Foo.StartDate.Year}"/>
    </TextBlock>
2
マックス

ここに素晴らしい例があります:

MSDNの例

コンバータークラスが別の名前空間にある場合(別のフォルダーにあることが推奨される)、追加できます。

xmlns:conv="using:MyNamespace.Converters"

次のように使用します:

<UserControl.Resources>
  <conv:DateToStringConverter x:Key="Converter1"/>
</UserControl.Resources>

残りはリンクの例と同じままにしてください。

1
Christoph

これはxml自体で行うことができます。ここに...

<DatePicker 
SelectedDate="{Binding Date, Mode=TwoWay}" 
Text="{Binding ., StringFormat='dd/MM/yyyy'}"/>
1
Shaamil Ahmed

StringFormatの良いところは、出力の形式を指定できることです。ここで、フォーマットを指定できるコンバータを使用します。

public sealed class DateTimeToStringConverter : IValueConverter
{
    public static readonly DependencyProperty FormatProperty =
        DependencyProperty.Register(nameof(Format), typeof(bool), typeof(DateTimeToStringConverter), new PropertyMetadata("G"));

    public string Format { get; set; }

    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is DateTime dateTime && value != null)
        {
            return dateTime.ToString(Format);
        }

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return DateTime.ParseExact(value.ToString(), Format, CultureInfo.CurrentCulture);
    }
}

使用方法(複数の形式の例):

<Page.Resources>
    <ResourceDictionary>
        <converters:DateTimeToStringConverter 
            x:Name="dateStringConverter" 
            Format="dd-MM-yyyy" />
        <converters:DateTimeToStringConverter
            x:Name="timeStringConverter"
            Format="HH:mm" />
    </ResourceDictionary>
</Page.Resources>

<!-- Display the date -->
<TextBlock Text="{Binding Path=Date, Converter={StaticResource dateStringConverter}}" />    

<!-- Display the time -->
<TextBlock Text="{Binding Path=Date, Converter={StaticResource timeStringConverter}}" />
0
Knelis

これを試して、

<Label x:Name="LblEstEndTime" Text="{Binding EndTime, StringFormat='Est. End Time: {0:MM/dd/yy h:mm tt}'}" Style="{StaticResource ListCellSubTitleStyle}" VerticalOptions="EndAndExpand" />

0