C# 使用MVVM在WPF中连续显示当前时间
我想在我的屏幕上显示当前时间,并使用MVVM模式在WPF屏幕上持续更新 我正在我的视图模型中编写此代码C# 使用MVVM在WPF中连续显示当前时间,c#,wpf,datetime,mvvm,C#,Wpf,Datetime,Mvvm,我想在我的屏幕上显示当前时间,并使用MVVM模式在WPF屏幕上持续更新 我正在我的视图模型中编写此代码 // creating a property private string _currentDateTime; public string CurrentDateTime { get { return _currentDateTime; } set { if (value != _currentDateTime)
// creating a property
private string _currentDateTime;
public string CurrentDateTime
{
get
{
return _currentDateTime;
}
set
{
if (value != _currentDateTime)
{
_currentDateTime = value;
this.RaisePropertyChanged(() => this.CurrentDateTime);
}
}
}
我写了这个方法
public string GetCurrentDateTime()
{
try
{
DispatcherTimer timer = new DispatcherTimer(new TimeSpan(0, 0, 1),
DispatcherPriority.Normal,
delegate
{
this.CurrentDateTime = DateTime.Now.ToString("HH:mm:ss");
},
this.Dispatcher);
return CurrentDateTime;
}
catch
{
return CurrentDateTime;
}
}
我用属性绑定了文本块,但它显示异常为this。CurrentDateTime
为null
有什么建议吗?我不确定你对
RaisePropertyChanged(()=>this.CurrentDateTime)的意图是什么
如果要处理MVVM属性更改通知,则此代码应该在您的VM中
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
那你的布景应该是
set
{
if (value != _currentDateTime)
{
_currentDateTime = value;
OnPropertyChanged("CurrentDateTime");
}
}
要不断更新您的时间,请使用
然后,您可以将间隔设置为1秒,并在每个计时器经过的事件上设置您的CurrentDateTime
CurrentDateTime = DateTime.Now.ToString();
我不确定为什么会出现这个问题,但我通过对代码的轻微更改实现了相同的功能
我在GetCurrentDateTime
方法的try
块中更改了代码
try
{
DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
dispatcherTimer.Start();
return CurrentDateTime;
}
有了这个,我为计时器添加了一个新方法
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
// Updating the Label which displays the current second
this.CurrentDateTime = DateTime.Now.ToString(" HH:mm tt");
// Forcing the CommandManager to raise the RequerySuggested event
CommandManager.InvalidateRequerySuggested();
}
现在它开始工作了我的猜测是RaisePropertyChanged具有签名RaisePropertyChanged(Expression propertyExpression),并且正在解析表达式树以将表达式的右侧解析为字符串属性名称。我对我的视图模型做了同样的事情,强制在属性和GUI字符串之间进行早期绑定,从而消除了将属性名称信息复制为属性和魔术字符串的需要。小心!在调用GetCurrentDateTime时,始终会启动一个新计时器。