我正在制作一个WP8应用程序,我想在屏幕上显示当前日期和时间(将刷新每分钟)。我设法让日期工作正常,但是刚刚赢得的时间并没有出现在我身上,而且我已经跟进了很多教程。它可能是非常愚蠢的东西,但我无法弄明白。我也使用MVVM模式,这对我来说很新,所以它可能与此有关吗?
这是我的ViewModel类;
public class SleepTrackerViewModel : INotifyPropertyChanged
{
private string _currentTime, _currentDate;
public event PropertyChangedEventHandler PropertyChanged;
public SleepTrackerViewModel()
{
CurrentDateText();
DispatcherTimerSetup();
}
private void DispatcherTimerSetup()
{
DispatcherTimer dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Interval = TimeSpan.FromMinutes(1);
dispatcherTimer.Tick += new EventHandler(CurrentTimeText);
dispatcherTimer.Start();
}
private void CurrentDateText()
{
CurrentDate = DateTime.Now.ToString("dddd dd MMMM yyyy");
}
private void CurrentTimeText(object sender, EventArgs e)
{
CurrentTime = DateTime.Now.ToString("HH:mm");
}
public string CurrentTime
{
get { return _currentTime; }
set
{
if (_currentTime != null)
_currentTime = value;
OnPropertyChanged("CurrentTime");
}
}
public string CurrentDate
{
get { return _currentDate; }
set
{
if (_currentDate != value)
_currentDate = value;
OnPropertyChanged("CurrentDate");
}
}
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
在我的XAML代码中,我有;
<TextBlock FontSize="25" Foreground="Red" HorizontalAlignment="Center" VerticalAlignment="Top" Text="{Binding CurrentTime}"/>
同样在XAML代码中,我将xmlns:local设置为我的ViewModel文件夹,并将UserControl.DataContext设置为正确的类。正如我所提到的,日期显示正常。时间确实在设计器视图中随机出现,但是当我运行代码时它就消失了。
感谢。
答案 0 :(得分:6)
我查看了你的代码,并想知道CurrentTime的setter。
以下内容:
if (_currentTime != null)
_currentTime = value;
应该是:
if (_currentTime != value)
_currentTime = value;
答案 1 :(得分:1)
@ WellerEE的回答是正确的,你应该Accept他的回答并提出它。 :D他的答案解决了你实际问过的问题,这是一个很好的答案的特征。
然而,在查看您的代码时,我发现您的时钟会一次关闭多达一分钟,具体取决于您启动应用程序的时间。如果您的计时器每隔秒
启动,那就更好了。dispatcherTimer.Interval = TimeSpan.FromSeconds(1);
最后一个想法:你可以确保你没有重新发明轮子 - 检查Charles Petzold's Awesome All Xaml Clock和Digital Version。
虽然它可能不需要所有的图形装饰,但这里仍然有一些很好的外卖,例如如何将DateTime.Now
直接嵌入代码作为资源,以及如何直接绑定到DateTime
对象。以下是这样的看法:
ClockTicker.cs:
// adapted from: ClockTicker.cs (c) 2006 by Charles Petzold
public class ClockTicker : DependencyObject
{
public ClockTicker()
{
StartTimer();
}
void StartTimer()
{
DispatcherTimer timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(100) };
timer.Tick += (s, e) => { DateTime = DateTime.Now; };
timer.Start();
}
public DateTime DateTime
{
get { return (DateTime)GetValue(DateTimeProperty); }
set { SetValue(DateTimeProperty, value); }
}
public static readonly DependencyProperty DateTimeProperty =
DependencyProperty.Register("DateTime", typeof(DateTime), typeof(ClockTicker));
}
ClockView.xaml:
<UserControl.Resources>
<local:ClockTicker x:Key="clock"/>
</UserControl.Resources>
<StackPanel>
<TextBlock Text="{Binding Source={StaticResource clock}, StringFormat={}{0:dddd dd MMMM yyyy}, Path=DateTime}"/>
<TextBlock Text="{Binding Source={StaticResource clock}, StringFormat={}{0:HH:mm}, Path=DateTime}"/>
</StackPanel>