0

Почему не происходит события для обновления состояния рисования стрелки?

Не будьте слишком строги ко мне, я учусь.

Таймер вызывается в MainWindow.xaml.css

Code Model:

public class TimeD
    {
        public double hss { get; set; }
        public double mss { get; set; }
        public double sss { get; set; }
        public void RR()
        {
            DispatcherTimer Timer = new DispatcherTimer
            {
                Interval = TimeSpan.FromSeconds(1)
            };
            Timer.Tick +=Timer_Tick;
            Timer.Start();
    }
    public void Timer_Tick(object sender, EventArgs e)
    {
        vmClock vmClock = new vmClock();
    }

    DateTime time = DateTime.Now;
    public double getHss()
    {

        hss = (time.Hour) * (360 / 12);
        return hss;
    }
    public double getMss()
    {

        mss = (time.Minute) * (360 / 60);
        return mss;
    }
    public double getSss()
    {
        sss = (time.Second) * (360 / 60);
        return sss;
    }


}


}

Code ViewModel:

public class vmClock : INotifyPropertyChanged
    {
        TimeD timeD = new TimeD();
        public double angleHour;
        public double angleMin;
        public double angleSec;
    public double AngleHour
    {
        set
        {
            angleHour = value;
            OnPropertyChanged("AngleHour");

        }
        get
        {
            return angleHour;
        }
    }

    public vmClock()
    {

        AngleHour = timeD.getHss();
        AngleMin = timeD.getMss();
        AngleSec = timeD.getSss();


    }

    public double AngleMin
    {
        set
        {
            angleMin = value;
            OnPropertyChanged("AngleMin");

        }
        get
        {
            return angleMin;
        }
    }

    public double AngleSec
    {
        set
        {
            angleSec = value;
            OnPropertyChanged("AngleSec");

        }
        get
        {
            return angleSec;
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string prop = null)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(prop));
    }

}

}

Code XAML:

Вот отрывок, где у меня Binding

<RotateTransform Angle="{Binding AngleMin, UpdateSourceTrigger=PropertyChanged}"/>
                    &lt;RotateTransform Angle=&quot;{Binding AngleSec, UpdateSourceTrigger=PropertyChanged}&quot;/&gt;

Mr. Empty
  • 1
  • 2
  • Вы каждую секунду создаете new vmClock(), это не кажется подозрительным? Покажите, где вы настраиваете DataContext. – aepot Aug 16 '21 at 10:50
  • Посмотрите внимательней на свой код, что видите? Вот у вас привязка :{Binding AngleMin, где свойство AngleMin? В классе vmClock, ок, а где свойство этого класса? Или, где он задан как DataContext? Я лишь вижу vmClock vmClock = new vmClock();, то есть создается локальная переменная, с которой ничего не делается. Так о каком обновлении может идти речь, если данных как таковых и нет? – EvgeniyZ Aug 16 '21 at 10:53
  • DataContext у меня в Main там же таймер var mw = new MainWindow {
                DataContext = new vmClock()
            };
            mw.Show();
            timeD.RR();
    
    – Mr. Empty Aug 16 '21 at 10:54
  • А ещё почитайте вот это https://ru.stackoverflow.com/a/1275283/373567 – aepot Aug 16 '21 at 10:55
  • Ну вот и ответ, то что происходит в таймере никак не влияет на привязки. Так как привязки смотрят в один экземпляр класса, а вы работаете каждую секунду с новым экземпляром. – aepot Aug 16 '21 at 10:56
  • Как это можно реализовать, не совсем понял, буду очень благодарен) – Mr. Empty Aug 16 '21 at 11:22
  • Не поняли что? Вот у вас есть в DataContext объект, в нем нужные вам данные. Вы вместо того, чтобы менять эти данные, пытаетесь в левом классе, который совершенно не знает про основные ваши данные, создать повторно, новый объект класса vmClock. Вывод? Вам надо в TimeD передать vmClock и менять свойства в уже созданном ранее классе. Ну либо обратное - ваш класс TimeD пусть содержит событие, которое по тику будет вызываться, а в vmClock подписываетесь на него и делаете нужные действия (это даже правильней). И да, УЖАСНЫЕ названия! – EvgeniyZ Aug 16 '21 at 15:11
  • примерно так? `vmClock vmClock = new vmClock(); public void Timer_Tick(object sender, EventArgs e) { DateTime time = DateTime.Now; vmClock.AngleHour = (time.Hour) * (360 / 12); vmClock.AngleMin = (time.Minute) * (360 / 60); vmClock.AngleSec = (time.Second) * (360 / 60);
        }`
    

    ' я его за таймер убрал а в самом таймере уже задаю

    – Mr. Empty Aug 16 '21 at 15:41

0 Answers0