使用DispatcherTimer显示随机数

时间:2019-06-12 13:31:09

标签: c# wpf random mvvm

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

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

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

我希望它显示一个数字(介于0-3000之间)并每秒更新一次此数字(转换为TextBlock)。

我创建了一个新类,尝试在其中创建DispatcherTimer和Random生成器,然后将其放在UI TextBlock中。

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();
        }
    }
}

我是否需要向要访问的所有类添加datacontext(例如用于绑定)?

这是MainWindow,我希望Rpm显示在第二个TextBlock中。

<StackPanel Orientation="Horizontal" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Right" VerticalAlignment="Center">
            <TextBlock Text="RPM:" Style="{StaticResource RpmDisplay}" />
            <TextBlock x:Name="RpmDisplayLabel" Text="{Binding }" Style="{StaticResource RpmDisplay}" />
        </StackPanel>

我想做些什么和/或做错了什么?

1 个答案:

答案 0 :(得分:1)

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

确保属性设置器触发更改通知,例如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);
    }
}

将视图模型类的实例分配给MainWindow的DataContext:

public MainWindow()
{
    InitializeComponent();

    DataContext = new MainWindowViewModel();
}

在视图中,将元素绑定到视图模型属性:

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