Доброго времени суток. Спустя долго время решил опробовать модель MVVM. Сразу же возникли трудности.
Решил начать с таймера, который каждую секунду передает значение в Label.
Как положено создал 3 папки
Viewmodels
MainWindowViewModel.cs
Views
MainWindow.xaml
public class Timers : INotifyPropertyChanged
{
DispatcherTimer _flwpTimer = new DispatcherTimer();
public string _fullTimeProgrammWork;
public string FullTimeProgrammWork
{
get { return _fullTimeProgrammWork; }
set { _fullTimeProgrammWork = value;
OnPropertyChanged("FullTimeProgrammWork");
}
}
void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new
PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
private string Int2StringTime(int time, int addtime)
{
time = Properties.Settings.Default.ProgrammWorkTimeInt;
time += addtime;
int hours = (time - (time % (60 * 60))) / (60 * 60);
int minutes = (time - time % 60) / 60 - hours * 60;
int seconds = time - hours * 60 * 60 - minutes * 60;
return String.Format("{0:00}:{1:00}:{2:00}", hours, minutes, seconds);
}
public void TimerStart()
{
_flwpTimer.Tick += new EventHandler(timerTick);
_flwpTimer.Interval = new TimeSpan(0, 0, 0, 0, 1000);
_flwpTimer.Start();
}
private void timerStop()
{
_flwpTimer.Stop();
_flwpTimer.IsEnabled = false;
}
public void timerTick(object sender, EventArgs e)
{
Properties.Settings.Default.ProgrammWorkTimeString = Int2StringTime(Properties.Settings.Default.ProgrammWorkTimeInt, 1);
Properties.Settings.Default.ProgrammWorkTimeInt++;
Properties.Settings.Default.Save();
SetFullTime();
}
}
}
В xaml указал
xmlns:md="clr-namespace:PersonalTrainer.ViewModels"
и
<Window.DataContext>
<md:MainWindowViewModel />
</Window.DataContext>
и соответственно сам Label
<Label x:Name="fullTimeProgrammWorkLabel" Content="{Binding Path=FullTimeProgrammWork}" Margin="10,80,10,286" HorizontalAlignment="Center" Foreground="White" FontSize="20" />
По модели передачу данных нужно реализовать в
public class MainWindowViewModel
{
public MainWindowViewModel()
{
}
}
Не могу понять как реализовать передачу каждую секунду
Код какой-то неполный, так что не уверен во всем что пишу. Но смотрите. Заведите этот класс как публичное свойство
(это важно!) в MainWindowViewModel
public class MainWindowViewModel
{
public Timers Timer {get;set;}
public MainWindowViewModel()
{
Timer = new Timers(); //тут стартаните его или что надо сделайте
}
}
Ну и привязывайтесь к нему (Надеюсь вы обновляете FullTimeProgrammWork
в ф-ции SetFullTime();
- если нет - обновляйте где-нибудь!):
<Label Content="{Binding Timer.FullTimeProgrammWork}" />
Должно сработать.
Это вариант с минимальными изменениями вашего кода, есть еще несколько способов как сделать. Вплоть до использования мессанджеров (например из какого-нибудь MVVM
фреймворка). Я бы вообще в MainWindowViewModel
все это замутил, не вынося в класс - хранил бы просто время как у вас в int
(?) (к которому бы и привязывался), а для отображения написал бы конвертер (ведь ViewModel
не должна заботится о способе отображения своих данных). Как-то так.
Фрилансер или Digital-агентство - Как сделать правильный выбор?
Я через свою программу запускаю дочерний процессЧерез некоторое время отработав он завершится
Например в "Решении" у меня есть один или несколько проектовКак выделенные проекты продублировать?
Вот например у меня есть PictureBox и мне надо рендерить на нем что-нибудь и проверять не рисую ли я на том что рендерится, если делать в MouseMove то к-во...