2

这是基于上一个问题的答案的后续行动。我设法提出了一个 DependencyProperty,它将使用计时器进行更新以始终具有最新的日期时间,以及一个显示日期时间的文本块。由于它是一个 DependencyProperty,每当计时器更新值时,文本块也会显示最新的 DateTime。

依赖对象

    public class TestDependency : DependencyObject
    {
        public static readonly DependencyProperty TestDateTimeProperty =
            DependencyProperty.Register("TestDateTime", typeof(DateTime), typeof(TestDependency),
            new PropertyMetadata(DateTime.Now));

        DispatcherTimer timer;

        public TestDependency()
        {
            timer = new DispatcherTimer(new TimeSpan(0,0,1), DispatcherPriority.DataBind, new EventHandler(Callback), Application.Current.Dispatcher);
            timer.Start();

        }

        public DateTime TestDateTime
        {
            get { return (DateTime)GetValue(TestDateTimeProperty); }
            set { SetValue(TestDateTimeProperty, value); }
        }

        private void Callback(object ignore, EventArgs ex)
        {
            TestDateTime = DateTime.Now;
        }

    }

窗口 Xaml

    <Window.DataContext>
        <local:TestDependency/>
    </Window.DataContext>
    <Grid>
        <TextBlock Text="{Binding TestDateTime}" />
    </Grid>

这很好用,但我想知道,如果我想以不同的方式格式化时间字符串,我该怎么办,有没有办法ToString(formatter)在日期时间上调用它,然后在文本块中显示它,同时保持使用 DependencyProperty 自动更新文本块的能力?如果可能的话,在后面的代码中执行此操作的正确方法是什么,以及在 Xaml 中执行此操作的正确方法是什么?

而且,如果我要显示多个文本框,每个文本框都有不同的日期时间格式,那么仅使用 1 个计时器在不同文本框中显示所有不同日期时间格式的正确方法是什么,我是否必须为每种格式?

4

2 回答 2

6

您可以为此使用字符串格式:

<Window.DataContext>
    <wpfGridMisc:TestDependency/>
</Window.DataContext>
<StackPanel>
    <TextBlock Text="{Binding TestDateTime, StringFormat=HH:mm:ss}"/>
    <TextBlock Text="{Binding TestDateTime, StringFormat=MM/dd/yyyy}"/>
    <TextBlock Text="{Binding TestDateTime, StringFormat=MM/dd/yyyy hh:mm tt}"/>
    <TextBlock Text="{Binding TestDateTime, StringFormat=hh:mm tt}"/>
    <TextBlock Text="{Binding TestDateTime, StringFormat=hh:mm}"/>
    <TextBlock Text="{Binding TestDateTime, StringFormat=hh:mm:ss}"/>
</StackPanel>

另外我认为您应该在更新 DependencyProperty 时使用 SetCurrentValue(),您可以在此处阅读原因

private void Callback(object ignore, EventArgs ex)
{
    SetCurrentValue(TestDateTimeProperty, DateTime.Now);
}
于 2013-02-05T11:29:14.000 回答
1

Binding 有一个StringFormat属性:

<TextBlock Text="{Binding TestDateTime, StringFormat=HH:mm:ss}"/>

另请参阅标准日期和时间格式字符串自定义日期和时间格式字符串

于 2013-02-05T11:32:27.040 回答