C# 使用Dispatchermer显示随机数

C# 使用Dispatchermer显示随机数,c#,wpf,random,mvvm,C#,Wpf,Random,Mvvm,我一直在寻找答案,但似乎没有一个符合我的问题 我正在尝试采用MvVM方法,但我认为我并不完全理解它 我正在尝试在WPF中创建RPM显示 我希望它显示一个数字(介于0-3000之间),并每秒更新一次这个数字(到文本块) 我已经创建了一个新类,尝试在其中创建一个Dispatchermer和Random generator,然后将其放在UI文本块中 using System; using System.Collections.Generic; using System.Text; using Syst

我一直在寻找答案,但似乎没有一个符合我的问题

我正在尝试采用MvVM方法,但我认为我并不完全理解它

我正在尝试在WPF中创建RPM显示

我希望它显示一个数字(介于0-3000之间),并每秒更新一次这个数字(到
文本块

我已经创建了一个新类,尝试在其中创建一个Dispatchermer和Random generator,然后将其放在UI文本块中

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Threading;

namespace Aldeba.UI.WpfClient
{
    public class GenerateRpm
    {
        public GenerateRpm()
        {
            DispatcherTimer timer = new DispatcherTimer
            {
                Interval = new TimeSpan(0, 0, 5)
            };
            timer.Start();
            timer.Tick += Timer_Tick;
        }
        public int RandomValue()
        {
            Random random = new Random();
            int RandomRpm = random.Next(0, 3001);
            return RandomRpm;
        }
        void Timer_Tick(object sender, EventArgs e)
        {
            MainWindow mainWindow = new MainWindow();

            GenerateRpm rpm = new GenerateRpm();
            mainWindow.RpmDisplayLabel.Text = rpm.RandomValue().ToString();
        }
    }
}
我的MainWindow.xaml.cs看起来像

   /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.DataContext = new MainWindowViewModel();
            this.DataContext = new GenerateRpm();
        }
    }
}

我遗漏了什么和/或做错了什么才能做到这一点?

使用如下所示的视图模型,并使用由计时器周期性更新的公共属性

确保属性设置程序触发更改通知,例如INotifyPropertyChanged接口的
PropertyChanged
事件

public class MainWindowViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private readonly Random random = new Random();

    public MainWindowViewModel()
    {
        var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
        timer.Tick += Timer_Tick;
        timer.Start();
    }

    private int randomRpm;

    public int RandomRpm
    {
        get { return randomRpm; }
        set
        {
            randomRpm = value;
            PropertyChanged?.Invoke(
                this, new PropertyChangedEventArgs(nameof(RandomRpm)));
        }
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        RandomRpm = random.Next(0, 3001);
    }
}
将视图模型类的实例分配给主窗口的DataContext:

public MainWindow()
{
    InitializeComponent();

    DataContext = new MainWindowViewModel();
}
在视图中,将图元绑定到视图模型属性:

<TextBlock Text="{Binding RandomRpm}"/>


MainWindow MainWindow=newmainwindow()没有任何意义。GeneratorPM应该公开并更新视图将绑定到的公共属性。同时移动
Random Random=new Random()并使其成为类成员。并且
GenerateRpm rpm=new GenerateRpm()在Tick处理程序中也是无意义的。那么
TimeSpan(0,0,5)
应该是多少秒呢?感谢您的澄清。我对编程非常陌生,我仍在尝试理解绑定和访问的方式。这就是为什么我会犯你在我的问题上评论的错误。
<TextBlock Text="{Binding RandomRpm}"/>