Нужна помощь с MVVM

110
12 января 2018, 22:55

Доброго времени суток. Спустя долго время решил опробовать модель MVVM. Сразу же возникли трудности.

Решил начать с таймера, который каждую секунду передает значение в Label.

Как положено создал 3 папки

  • Models
    Timers.cs
  • 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()
        {     
        }
    }

Не могу понять как реализовать передачу каждую секунду

Answer 1

Код какой-то неполный, так что не уверен во всем что пишу. Но смотрите. Заведите этот класс как публичное свойство (это важно!) в 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 не должна заботится о способе отображения своих данных). Как-то так.

READ ALSO
Дождаться завершения процесса

Дождаться завершения процесса

Я через свою программу запускаю дочерний процессЧерез некоторое время отработав он завершится

101
Как продублировать проекты в Visual Studio?

Как продублировать проекты в Visual Studio?

Например в "Решении" у меня есть один или несколько проектовКак выделенные проекты продублировать?

108
Как получить адрес из ссылки

Как получить адрес из ссылки

Имеется кусок html

85
C# Запустить 2 одинаковых события

C# Запустить 2 одинаковых события

Вот например у меня есть PictureBox и мне надо рендерить на нем что-нибудь и проверять не рисую ли я на том что рендерится, если делать в MouseMove то к-во...

86