C# Dispatchermer使用MVVM更新文本块

C# Dispatchermer使用MVVM更新文本块,c#,xaml,windows-phone-8,mvvm,dispatchertimer,C#,Xaml,Windows Phone 8,Mvvm,Dispatchertimer,如果这不值得问一个问题,我会道歉,但我不明白为什么我所做的不起作用 我正在制作一个WP8应用程序,我想在屏幕上显示当前日期和时间(每分钟刷新一次)。我已经设法让约会顺利进行,但时间对我来说就是不可能出现,我已经学习了很多教程。这可能是很愚蠢的事情,但我想不出来。我还使用了MVVM模式,这对我来说是非常新的,所以这可能与此有关 这是我的ViewModel课程 public class SleepTrackerViewModel : INotifyPropertyChanged { priv

如果这不值得问一个问题,我会道歉,但我不明白为什么我所做的不起作用

我正在制作一个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设置为正确的类。正如我所提到的,日期很好。时间确实随机出现在designer视图中,但当我运行代码时,它就消失了


谢谢。

我看了你的代码,想知道CurrentTime的setter

以下是:

  if (_currentTime != null)
       _currentTime = value;
应该是:

  if (_currentTime != value)
       _currentTime = value;

@韦勒雷的答案是正确的,你也应该对他的答案投赞成票他的回答回答了你实际提出的问题,这是一个好答案的特征

然而,在查看您的代码时,我突然想到,您的时钟一次最多会关闭一分钟,这取决于您启动应用程序的时间。如果您的计时器每秒钟启动一次会更好:

最后一个想法是:你可以确保你没有重新发明轮子——检查一下

诚然,您可能不需要所有的图形工具,但这里仍然有一些好方法,例如如何将
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>


分派器分派器分派器
当作班级成员。啊,该死的,我知道这会很可笑。不知道我怎么会错过。不要认为我的眼睛适合Visual Studio lol上的黑暗主题。感谢您的帮助,并为浪费时间表示歉意。
<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>