使用WPF的日期转换器

8
public class DateTimeConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (values != null)
        {
            DateTime test = (DateTime) value ;
            string date = test.ToString("d/M/yyyy");
            return (date);
        }
        return string.Empty;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

我制作了这个转换器,从DatePicker选择日期后获取当前时间。在字符串中,我获得从DatePicker选择的值,但我似乎不能只获取日期。传递给Value属性的格式是9/24/2013 12:00:00,但我希望它是9/24/2013。我已经在datetime converter WPF上问过类似的问题,但提供的答案都无法解决。我收到相同的错误:指定的转换无效。

你为什么要写这个类?DateTime 已经有很多内置的 .ToString 转换了。如果这就是它的全部作用,那么没有必要再写一个类了。 - Jon La Marr
我正在从我的XAML中调用它,我认为我需要从转换器中完成它。如果不需要的话,您可以请展示一个例子吗? - Robert
我还想添加正确的时间。 - Robert
2个回答

20

你不需要使用转换器来完成这个任务。你可以在绑定本身中使用StringFormat将选定的日期时间格式化为 mm/dd/yyyy 格式,以仅显示日期。

<TextBlock Text="{Binding Date, StringFormat={}{0:MM/dd/yyyy}}" />

我用这段代码进行测试,它运行得很好。 XAML:

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding TestList}">
            <DataGrid.Columns>
            <DataGridTemplateColumn Header="Start">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Start, StringFormat=d}" FontFamily="Verdana" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <DatePicker SelectedDate="{Binding Start}" FontFamily="Verdana"  >
                        <DatePicker.CalendarStyle>
                            <Style TargetType="Calendar">
                                <Setter Property="DisplayMode" Value="Month"/>
                            </Style>
                        </DatePicker.CalendarStyle>
                    </DatePicker>
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

型号:

    public class TestData
    {
        DateTime start;
        public DateTime Start
        {
            get { return start; }
            set { start = value; }
        }

    }

ViewModel有一个TestData列表,将被绑定到DataGrid上:

public List<TestData> TestList { get; set; }

这就是我尝试的,但当文本块失去焦点时,它会回到添加12:00:00 AM的状态。我还查看了失去焦点以查看是否有任何操作,但没有。 - Robert
你能分享一下你的 XAML 和 VM 代码吗?它应该能够正常运行。我需要检查你的代码才能帮助你。 - Nitin
这是我的XAML代码链接:https://dev59.com/Z3bZa4cB1Zd3GeqPGoW7 - Robert
请确认更新后的答案代码在您这边是否正常运行? - Nitin
当我将绑定名称从start更改为start1时,字符串格式有效了。 我认为这与从数据源绑定的数据有关。 - Robert
更改 ds 中的数据是否会干扰绑定? - Robert

0

试试这个。

DateTime test = (DateTime) value ;
string date = test.Date.ToString("d/M/yyyy"); 
//Use test.Date.tostring instad of test.tostring(...)
return (date);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接