Я довольно новичок в C# и программировании в целом.C# Связать таймер обратного отсчета с текстовым полем в приложении для магазина Windows
В предыдущем вопросе "C# Reset a countdown timer-DispatcherTimer-" У меня была помощь по сбросу моего таймера. Тогда я попытался сделать мой код более элегантным и попытался создать отдельный класс для таймера и обновить отсчет текстового блока с помощью привязки данных вместо жесткого кодирования свойства текста в этой строке в timer_Tick():
Countdown.Text = (int)(duration - sw.Elapsed).TotalSeconds + " second(s)
Моей проблема заключается в том, что привязка не выполняется. Я все еще борюсь с MVVM. Вот мой код:
CountDownTimer.cs
class CountDownTimer : DispatcherTimer
{
public System.Diagnostics.Stopwatch sw { get; set; }
static readonly TimeSpan duration = TimeSpan.FromSeconds(60);
private int _seconds;
public int Seconds
{
get { return _seconds; }
set { _seconds = value; NotifyPropertyChanged("Seconds"); }
}
private string _timeElapsed;
public string TimeElapsed
{
get { return _timeElapsed; }
set { _timeElapsed = value; NotifyPropertyChanged("TimeElapsed"); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public void timer_Tick(object sender, object e)
{
if (sw.Elapsed <= duration)
{
Seconds = (int)(duration - sw.Elapsed).TotalSeconds;
TimeElapsed = String.Format("{0} second(s)", Seconds);
}
else
{
TimeElapsed = "Times Up";
this.Stop();
}
}
}
EquationView.xaml
<StackPanel x:Name="timePanel" Orientation="Horizontal" Visibility="Collapsed">
<TextBlock Text="Time Left: " Height="auto"
Margin="20,10,5,10" FontSize="26"/>
<TextBlock x:Name="countdown" Text="{Binding TimeElapsed}"
Margin="20,10,20,10" Width="200"
Height="auto" FontSize="26"/>
</StackPanel>
EquationView.xaml.cs
public sealed partial class EquationView : Page
{
//code
private void startButton_Click(object sender, RoutedEventArgs e)
{
//more code
// If level == difficult enable timer
if (Level == PlayerModel.LevelEnum.Difficult)
{
// timer commands
timer.sw = System.Diagnostics.Stopwatch.StartNew();
timer.Interval = new TimeSpan(0, 0, 0, 1);
timer.Tick += timer.timer_Tick;
timer.Start();
countdown.DataContext = timer;
//more code
} //end of method
// much more code
} //end of class EquationView
Я вставил строку countdown.Text = timer.TimeElapsed;, чтобы попытаться выяснить, что было выключено, и это дало мне System.NullReferenceException. Затем я сменил его на таймер. Второй раз, когда он показал 0, но после этого он возвращает 56 или 57.
p.s. Я перепечатал метод измененного свойства из моего класса BindableBase, потому что сейчас я не хочу иметь дело с множественным наследованием.
Где вы установите DataContext? –
после таймера.Start(); обратный отсчет.DataContext = таймер; Я просто прокомментировал это, чтобы попробовать что-то после того, как оно не сработало. – D3v
В этой статье много информации о таймерах и связанных классах. http://www.codeproject.com/Articles/330073/A-WPF-MVVM-Countdown-Timer –