代码之家  ›  专栏  ›  技术社区  ›  iLemming

绑定到DateTime.Now。更新值

  •  11
  • iLemming  · 技术社区  · 14 年前

    嗯,我需要绑定DateTime。现在到一个TextBlock,我用了:

     Text="{Binding Source={x:Static System:DateTime.Now},StringFormat='HH:mm:ss tt'}"
    

    现在,如何强制更新?它得到的时候,控制加载,不会更新它。。。

    4 回复  |  直到 14 年前
        1
  •  23
  •   myermian    12 年前

    编辑(我没有说明他想自动更新):

    这里是 a link 使用INotifyPropertyChanged以便自动更新的“Ticker”类。以下是网站的代码:

    namespace TheJoyOfCode.WpfExample
    {
        public class Ticker : INotifyPropertyChanged
        {
            public Ticker()
            {
                Timer timer = new Timer();
                timer.Interval = 1000; // 1 second updates
                timer.Elapsed += timer_Elapsed;
                timer.Start();
            }
    
            public DateTime Now
            {
                get { return DateTime.Now; }
            }
    
            void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("Now"));
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
        }
    }
    
    
    <Page.Resources>
       <src:Ticker x:Key="ticker" />
    </Page.Resources>
    
    <TextBox Text="{Binding Source={StaticResource ticker}, Path=Now, Mode=OneWay}"/>
    

    声明:

    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    

    现在这将起作用:

    <TextBox Text="{Binding Source={StaticResource ticker}, Path=Now, Mode=OneWay}"/>
    
        2
  •  2
  •   aloisdg    10 年前

    对于Windows Phone,可以使用以下代码段

    public Timer()
    {
        DispatcherTimer timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromSeconds(1); // 1 second updates
        timer.Tick += timer_Tick;
        timer.Start();
    }
    
    public DateTime Now
    {
        get { return DateTime.Now; }
    }
    
    void timer_Tick(object sender, EventArgs e)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs("Now"));
    }
    
    public event PropertyChangedEventHandler PropertyChanged;
    

        3
  •  1
  •   SLaks    14 年前

    你需要做一个定时器,每秒钟更新一次文本框。

        4
  •  0
  •   Maksim Satsikau    6 年前

    实际上,这样做的“规范”方法是设置一个dispatcher

        <Storyboard x:Key="clockStory" Duration="0:0:2" RepeatBehavior="Forever">
            <StringAnimationUsingKeyFrames
                Storyboard.TargetName="clock"
                Storyboard.TargetProperty="(Label.Tag)">
                <DiscreteStringKeyFrame KeyTime="0:0:0" Value="Let's force binding" />
                <DiscreteStringKeyFrame KeyTime="0:0:1" Value="..to change back and forth" />
            </StringAnimationUsingKeyFrames>
        </Storyboard>
    </Window.Resources>
    
    <Window.Triggers>
        <EventTrigger RoutedEvent="FrameworkElement.Loaded">
            <BeginStoryboard Storyboard="{StaticResource clockStory}"/>
        </EventTrigger>
    </Window.Triggers>
    
    <Grid>
        <Label x:Name="clock" Content="{Binding ElementName=clock, Path=Tag, Converter={StaticResource conv}}"/>
    </Grid>
    

    ..转换器如下

    public class AnythingToCurrentTimeConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return DateTime.Now.ToString("HH:mm:ss");
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }