2011-04-08 7 views
9

Я хочу посмотреть, есть ли способ комбинировать datetime строковый формат и статические строки.Xaml StringFormat и статические строки

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

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

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

ответ

1

Вы могли бы использовать что-то вроде этого вместо Binding:

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

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

+0

Я думаю, что это единственная альтернатива, если вы хотите, чтобы заполнить как значение и формат значения. Я попробовал 'string.Format (« Начать {0: {1}} », DateTime.Now,« dd-MMM-yyyy HH: mm »)' и получил исключение. –

1

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

<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[] { }; 
    } 
} 

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

Где:

Binding 0: полный формат без специального формата ({0: dd-MMM-yyyy HH: mm} заменен на {0})

Связывание нечетное (1,3,5 ...): переменный конкретный формат ("dd- MMM-yyyy HH: mm ")

Binding даже (2,4,6 ...): значение переменной (MyDate)

Смежные вопросы