Форматирование даты с использованием аннотаций данных для формы данных в Silverlight - PullRequest
2 голосов
/ 06 апреля 2010

Возможно, на этот вопрос есть простой ответ, но у меня проблемы с форматированием даты для поля формы данных.

        <df:DataForm x:Name="Form1" ItemsSource="{Binding Mode=OneWay}" AutoGenerateFields="True"
                AutoEdit="True" AutoCommit="False"
                CommitButtonContent="Save"
                CancelButtonContent="Cancel"               
                CommandButtonsVisibility="Commit"
                LabelPosition="Top" ScrollViewer.VerticalScrollBarVisibility="Disabled"
                EditEnded="NoteForm_EditEnded"> 
        <df:DataForm.EditTemplate>
            <DataTemplate>                    
                <StackPanel>
                    <df:DataField>
                        <TextBox Text="{Binding Title, Mode=TwoWay}"/>
                    </df:DataField>

                    <df:DataField>
                        <TextBox Text="{Binding Description, Mode=TwoWay}" AcceptsReturn="True" HorizontalScrollBarVisibility="Auto"
                                 VerticalScrollBarVisibility="Auto" Height="" TextWrapping="Wrap" SizeChanged="TextBox_SizeChanged"/>                        
                    </df:DataField>

                    <df:DataField>
                        <TextBlock Text="{Binding Username}"/>
                    </df:DataField>

                    <df:DataField>
                        <TextBlock Text="{Binding DateCreated}"/>
                    </df:DataField>
                </StackPanel>
            </DataTemplate>
        </df:DataForm.EditTemplate>
    </df:DataForm>

Я связал это с классом заметок, который имеет аннотацию для поля DateCreated:

 /// <summary>
    /// Gets or sets the date created of the noteannotation
    /// </summary>
    [Display(Name="Date Created")]
    [Editable(false)]
    [DisplayFormat(DataFormatString = "{0:u}", ApplyFormatInEditMode = true)]
    public DateTime DateCreated { get; set; }

Независимо от того, что я устанавливаю строку форматирования данных, это возвращается как: например, 4/6/2010 10:02:15 AM

Я хочу, чтобы это было в формате гггг-ММ-дд ЧЧ: мм: сс

Я пробовал пользовательский формат выше {0: гггг-мм-дд чч: мм: сс}, но он остался прежним. То же самое происходит для {0: u} или {0: s}.

1 Ответ

4 голосов
/ 13 апреля 2010

Это было решено добавлением конвертера к привязке данных:

<df:DataField>
    <TextBlock Text="{Binding DateCreated, Converter={StaticResource DateConverter}}"/>
</df:DataField>

DateConverter - это просто класс, который реализует интерфейс IValueConverter.В приведенном ниже примере показан формат даты и времени, который мне был нужен.

/// <summary>
/// Date time formatter - for short dates for data bound items
/// </summary>
public class DateConverter : IValueConverter
{
    #region Public Methods

    #region IValueConvertor Members

    /// <summary>
    /// Convert data item to a short date
    /// </summary>
    /// <param name="value">Value</param>
    /// <param name="targetType">Target type</param>
    /// <param name="parameter">Paramter</param>
    /// <param name="culture">Culture</param>
    /// <returns>Converted object</returns>
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var date = (DateTime)value;
        return (date.ToString("dd/MM/yyyy HH:mm:ss"));
    }

    /// <summary>
    /// Convert back data item to a short date
    /// </summary>
    /// <param name="value">Value</param>
    /// <param name="targetType">Target type</param>
    /// <param name="parameter">Paramter</param>
    /// <param name="culture">Culture</param>
    /// <returns>Converted object</returns>
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var s = (string)value;
        return (DateTime.Parse(s));
    }

    #endregion IValueConvertor Members

    #endregion Public Methods
}

Это работает как удовольствие - может быть улучшено с некоторой проверкой нуля!:)

...