生成随机数并使用 INotifyPropertyChanged 更新 UI

Generating a random numbers and using INotifyPropertyChanged to Updating UI

我是 c# 的新手,目前正在开发一个程序。它有一个简单的 UI,有两个按钮(一个叫 on,另一个叫 off),还有一个文本框显示一些结果。基本上我想做的是,如果用户单击 "on" 按钮,在与 windows 不同的 class 表单上 每隔一秒生成一次随机数 使用一种方法。通过实施 INotifyPropertyChanged,我想让文本框知道该值已更新,以便文本框不断更新我们的新随机数。一旦用户点击 "off" 按钮,我想停止生成随机数。

我的windows表格

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SWE_Assignment
{
    public partial class Monitor : Form
    {
        Patient newPatient = Patient.Instance;
        public static bool pulseRateOn = false;
        public Monitor()
        {
            InitializeComponent();

            newPatient.PropertyChanged += _PulseRate_PropertyChanged;
        }

        private void Save_Click(object sender, EventArgs e)
        {

           // newPatient.PL(newPatient.startRnd = true;);
        }

        void _PulseRate_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "PulseRate")
            {
                HeartBeat.Text = newPatient.PulseRate.ToString();
            }
        }



        private void Stop_Click(object sender, EventArgs e)
        {
            newPatient.startRnd = false;
        }
    }
}

我的病人Class

namespace SWE_Assignment
{
    class Patient : INotifyPropertyChanged
    {

        private int _pulseRate;
        public bool startRnd = false;
        Random rnd = new Random();
        public int PulseRate
        {
            get { return _pulseRate; }
            set
            {
                _pulseRate = value;
                OnPropertyChanged("PL");
            }
        }


        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string properyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(properyName));
        }

        private static Patient _instance = null;
        private static readonly object _padlock = new object();
        public static Patient Instance
        {
            get
            {
                lock (_padlock)
                {
                    if (_instance == null)
                    {
                        _instance = new Patient();
                    }
                    return _instance;
                }
            }
        }




        public void PL(bool srt)
        {
            Timer timer = new Timer();
            timer.AutoReset = true;
            timer.Interval = 1000;


            if (startRnd == true)
            {
                timer.Elapsed += PLS;
                timer.Enabled = true;
                timer.Start();
            } else
            {
                timer.Enabled = false;
                timer.Stop();
            }
        }

        private void PLS(object sender, ElapsedEventArgs e)
        {

            PulseRate = rnd.Next(100, 150);
            Console.WriteLine(PulseRate);

        }
    }
}

此外,我正在为我的患者使用单例模式,因为我只想拥有一个患者实例,这样我就可以访问另一个 class(称为警报)上的相同随机数来检查是否它大于或小于某个数字。我确实意识到我的 "Stop" 按钮有问题,因为它只会再次调用该方法,而不会停止来自 运行 的方法。如果有人能提供帮助,我将不胜感激。

有几处需要更改。

OnPropertyChanged("PL"); - 属性 的名字是 PulseRate。 "PulseRate" 是您在事件处理程序中检查的内容。做到 OnPropertyChanged("PulseRate");

Timer timer = new Timer(); - 您应该只为每个患者创建一个计时器实例。最好在构造函数中完成。否则你将拥有多个 运行 份 Timer

可以通过启用 属性 来管理计时器: 调用 Start() 方法与将 Enabled 设置为 true 相同。同样,调用 Stop() 方法与将 Enabled 设置为 false 相同。

private void Stop_Click(object sender, EventArgs e)
{
    // newPatient.startRnd = false;
    newPatient.PL(false);
}

class Patient : INotifyPropertyChanged
{
    Timer timer;
    private Patient()
    {
        timer = new Timer();
        timer.AutoReset = true;
        timer.Interval = 1000;
        timer.Elapsed += PLS;
    }

    Random rnd = new Random();

    private int _pulseRate;
    public int PulseRate
    {
        get { return _pulseRate; }
        set
        {
            _pulseRate = value;
            OnPropertyChanged("PulseRate");
        }
    }

    public void PL(bool srt)
    {
        timer.Enabled = srt;
    }

    private void PLS(object sender, ElapsedEventArgs e)
    {
        PulseRate = rnd.Next(100, 150);
        Console.WriteLine(PulseRate);
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string properyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(properyName));
    }

    private static Patient _instance = null;
    private static readonly object _padlock = new object();
    public static Patient Instance
    {
        get
        {
            lock (_padlock)
            {
                if (_instance == null)
                {
                    _instance = new Patient();
                }
                return _instance;
            }
        }
    }
}