2

これは、WPFデータグリッドを使用するカスタム日付形式スレッドとは少し異なるしわです。

私のWin7ボックスには、コントロールパネルでdd-MM-yyとして定義されたカスタムの短い日付文字列があります。DataGridの日付列でその設定を表示に使用したいと思います。ビューモデルには、「日付」と呼ばれるDateTimeがあります。

私はこれを試しました:

   <DataGrid AutoGenerateColumns="False" Name="dataCondition" ItemsSource="{Binding}">
    <DataGrid.Columns>
      <DataGridTextColumn Binding="{Binding Name}" ></DataGridTextColumn>
      <DataGridTextColumn Binding="{Binding Date, StringFormat=d}" />
      <DataGridTextColumn Binding="{Binding Comment}"></DataGridTextColumn>
    </DataGrid.Columns>
  </DataGrid>

日付列はm/d/yyyyとして表示されます。DataGridは、カスタムであるかどうかに関係なく、システムの短い日付設定を使用しませんか?

WPFDatePickersの動作は異なるようです。カスタムの短い日付形式は、StringFormatがなくても使用されます(ビューモデルでDateTimeに直接バインドされます)。

ゲッターがDateTime.ToShortDateStringを使用するビューモデル(Date-> DateFormatted)で文字列プロパティを作成することでDataGridでこの問題を回避できますが、これがこれを行うための最良の方法かどうかはわかりません。そして、私はまだバインディングTwoWayの部分を解決していません...:P

4

5 に答える 5

12

これをあなたのように設定/バインドしてみてくださいConverter

[ValueConversion(typeof(DateTime), typeof(String))]
public class DateConverter : IValueConverter
{
    private const string _format = "dd-MM-yy";

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        DateTime date = (DateTime)value;

        return date.ToString(_format);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return DateTime.ParseExact((string) value, _format, culture);
    }

}

次に、XAML を次のように設定します。

<Window.Resources>
    <wpfDataGridMisc:DateConverter x:Key="dateConverter"/>
</Window.Resources>

<DataGridTextColumn Binding="{Binding Date, Converter={StaticResource dateConverter}}"/>
于 2013-01-11T17:58:54.170 に答える
9

解決策はかなり単純だと思います。使用StringFormatしている は無効であるため、無視され、DataGridTextColumnデフォルトの形式に頼ります。代わりに as を指定するddStringFormat、期待どおりに機能します。

したがって、最終的なバインディングは次のようになります (TwoWay を含む):

<DataGridTextColumn Binding="{Binding Date, StringFormat=dd, Mode=TwoWay}" />

ただし、これは編集モードでは混乱を招くことに注意してください。列に数字 (日) が表示されていても、実際には有効な日付を書き込んでからでないと入力が受け入れられず、再度フォーマットされるためです。に依頼します。これを回避するには、DataGridTemplateColumn代わりに a を使用し、そこに and を指定CellTemplateCellEditingTemplateます。

于 2013-01-12T08:09:26.473 に答える
0

UICultureアプリケーションがいつ起動するかを設定する必要があります。次に、コンピューターからの正しいフォーマットを使用します。XAML リソースは常に既定で表示されen-USます。

于 2016-06-21T15:02:23.117 に答える
0

これにより、日時形式を構成できます。

VB コード

Imports System.Windows.Data

Public Class DateTimeToString
    Implements IValueConverter

    Private _Format As String
    Public Property Format() As String
        Get
            Return _Format
        End Get
        Set(ByVal value As String)
        End Set
    End Property

    Public Function Convert(ByVal value As Object, _
                            ByVal targetType As System.Type, _
                            ByVal parameter As Object, _
                            ByVal culture As System.Globalization.CultureInfo) As Object _
                            Implements System.Windows.Data.IValueConverter.Convert
        Dim DateTimeValue As DateTime
        If DateTime.TryParse(value, DateTimeValue) Then
            Return DateTimeValue.ToString(_Format)
        End If
        Return value
    End Function

    Public Function ConvertBack(ByVal value As Object, _
                                ByVal targetType As System.Type, _
                                ByVal parameter As Object, _
                                ByVal culture As System.Globalization.CultureInfo) As Object _
                                Implements System.Windows.Data.IValueConverter.ConvertBack
        Dim StringValue As String = value.ToString
        Dim DateTimeValue As DateTime
        If DateTime.TryParse(StringValue, DateTimeValue) Then
            Return DateTimeValue
        End If
        Return value
    End Function
End Class

C# コード

public class DateTimeToString : IValueConverter
{
    public string Format { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        DateTime DateTimeValue = (DateTime)value;
        return DateTimeValue.ToString(Format);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string strValue = value.ToString();
        DateTime DateTimeValue;
        if (DateTime.TryParse(strValue, out DateTimeValue))
            return DateTimeValue;
        return value;
    }
}

XAML コード

<TextBlock Text="{Binding BirthDate, Converter={StaticResource DateToString}}" />
于 2014-10-01T04:10:43.123 に答える
-1

コンバーターを作成し、datetime 列のバインディングで使用します。IValueConverter を継承するクラス。DateTime を受け取り、文字列を返します。

于 2013-01-11T17:20:50.937 に答える