Xaml StringFormat и статические строки - PullRequest
10 голосов
/ 08 апреля 2011

Я хочу посмотреть, есть ли способ объединить дату и время формат строки и статические строки.

Так что в настоящее время я могу отформатировать свою дату и префикс с помощью следующего текста:

<TextBlock Text="{Binding MyDate StringFormat=Started {0:dd-MMM-yyyy HH:mm}}"

Результаты таковы:

Started 01-Jan-2011 12:00

В прошлом я мог использовать статическую строку, чтобы сохранить общий формат для моих дат;вот так (обратите внимание, без префикса текста):

<TextBlock Text="{Binding MyDate, StringFormat={x:Static i:Format.DateTime}}" />

Где i:Format - статический класс со статическим свойством DateTime, который возвращает строку "dd-MMM-yyyy HH:mm"

Так что я?я спрашиваю;Есть ли способ объединить эти методы, чтобы я мог использовать префикс своей даты и использовать обычный формататор статических строк?

Ответы [ 2 ]

2 голосов
/ 08 апреля 2011

Вместо привязки можно использовать что-то вроде этого:

public class DateTimeFormattedBinding : Binding {
    private string customStringFormat = "%date%";

    public DateTimeFormattedBinding () {
        this.StringFormat = Format.DateTime;
    }

    public DateTimeFormattedBinding (string path)
        : base(path) {
        this.StringFormat = Format.DateTime;
    }

    public string CustomStringFormat {
        get {
            return this.customStringFormat;
        }
        set {
            if (this.customStringFormat != value) {
                this.customStringFormat = value;
                if (!string.IsNullOrEmpty(this.customStringFormat)) {
                    this.StringFormat = this.customStringFormat.Replace("%date%", Format.DateTime);
                }
                else {
                    this.StringFormat = string.Empty;
                }
            }
        }
    }
}

Тогда используйте это как {local:DateTimeFormattedBinding MyDate, CustomStringFormat=Started %date%}

Возможно, вы также можете сделать замену универсальной и установить ее с помощью другого свойства (или свойств).

1 голос
/ 15 июля 2014

вы можете использовать такой конвертер:

<TextBlock>
    <TextBlock.Text>
                <MultiBinding Converter="{StaticResource StringFormatConcatenator}">
                        <Binding Source="Started {0}"/>
                        <Binding Source="{x:Static i:Format.DateTime}"/>                                        
                        <Binding Path="MyDate"/>
                </MultiBinding>
    </TextBlock.Text>
</TextBlock>

public class StringFormatConcatenator : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string format = values[0].ToString();
        for (int i = 0; i < (values.Length - 1) / 2; i++)
            format = format.Replace("{" + i.ToString() + "}", "{" + i.ToString() + ":" + values[(i * 2) + 1].ToString() + "}");

        return string.Format(format, values.Skip(1).Select((s, i) => new { j = i + 1, s }).Where(t => t.j % 2 == 0).Select(t => t.s).ToArray());
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        return new string[] { };
    }
}

Вы можете добавить столько переменных для форматирования, сколько необходимо, в паре (формат, значение)

Где:

Привязка 0: полный формат без определенного формата переменной ({0: дд-МММ-гггг ЧЧ: мм} заменено на {0})

Нечетное связывание (1,3,5 ...):специфичный для переменной формат («дд-ммм-гггг чч: мм»)

Четность привязки (2,4,6 ...): значение переменной (MyDate)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...