Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用MVVM在WPF中连续显示当前时间_C#_Wpf_Datetime_Mvvm - Fatal编程技术网

C# 使用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)

我想在我的屏幕上显示当前时间,并使用MVVM模式在WPF屏幕上持续更新

我正在我的视图模型中编写此代码

// 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时,始终会启动一个新计时器。