Действительно, «канонический» способ сделать это - настроить DispatcherTimer
Однако вы также можете сделать это с раскадровкой и фальшивым конвертером, например:
<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();
}
}
Наслаждайтесь!