2015-01-24 5 views
1

이 질문에 답할 가치가없는 경우 사과하겠습니다.하지만 내가하고있는 일이 왜 작동하지 않는 지에 대해서는 당황 스럽습니다.DispatcherTimer가 MVB로 TextBlock을 업데이트 함

WP8 앱을 만들고 있는데 화면에 현재 날짜와 시간 (1 분마다 새로 고침)을 표시하고 싶습니다. 나는 그 일을 잘 처리 할 수 ​​있었지만 시간은 나에게 나타나지 않을 것이고 수많은 자습서를 따라 갔다. 아마도 뭔가 어리석은 짓 일지 모르지만 그걸 알아낼 수는 없어요. 나도 꽤 새로운 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 코드에 있습니다. 내 뷰 모델 폴더로 지역 설정, 또한 올바른 클래스로 설정 UserControl.DataContext 있습니다

  <TextBlock FontSize="25" Foreground="Red" HorizontalAlignment="Center" VerticalAlignment="Top" Text="{Binding CurrentTime}"/> 

는 또한 XAML 코드에서, 나는 나의 XMLNS 있습니다. 내가 언급했듯이, 날짜는 잘 나타납니다. 디자이너보기에는 무작위로 시간이 표시되었지만 코드를 실행하면 사라졌습니다.

감사합니다.

+0

만들기'DispatcherTimer dispatcherTimer'. –

답변

6

나는 당신의 코드를보고, CurrentTime의 세터에 대해 궁금해하고 있었다. WellerEE의 대답 @

if (_currentTime != value) 
     _currentTime = value; 
+0

아, 그게 우스꽝 스러울 줄 알았어. 나는 그것을 놓쳤다. 내 눈이 Visual Studio LOL의 어두운 테마에 적합하다고 생각하지 마십시오. 시간 낭비에 대한 도움과 사과에 감사드립니다. –

1

오른쪽 하나이며, 당신은 그의 대답을 Accept 너무 그것을 찬성 투표한다 :

if (_currentTime != null) 
     _currentTime = value; 

아마해야합니다 :

다음. : D 그의 대답은 당신이 실제로 물어 보았던 질문을 다루고 있는데 그것은 좋은 대답의 특징입니다.

그러나 코드를 살펴보면 앱 시작시기에 따라 시계가 한 번에 1 분씩 꺼지는 것이 나에게 발생했습니다. 당신의 타이머가 모든 을 발사하면 좋을 것 :

dispatcherTimer.Interval = TimeSpan.FromSeconds(1); 

마지막 생각 : 당신은 당신이 바퀴 재발하지 않을 만들 수도 - Charles Petzold's Awesome All Xaml ClockDigital 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>